洛谷P11655「FAOI-R5」Lovely 139
P11655「FAOI-R5」Lovely 139
题目背景
Update:数据有 0 0,答案为 1,请选手特判以正常通过。
Height ≤ 139 \text{Height}\leq139 Height≤139。
题目描述
对于一个 01 \tt 01 01 串 S S S(下标从 1 1 1 开始),我们定义它的一个区间 [ l , r ] [l,r] [l,r] 是极长颜色段,当且仅当它同时满足以下条件:
- 如果 l ≠ 1 l\neq 1 l=1, S l − 1 ≠ S l S_{l-1}\neq S_l Sl−1=Sl;
- 如果 r ≠ ∣ S ∣ r\neq \lvert S\rvert r=∣S∣, S r + 1 ≠ S r S_{r+1}\neq S_r Sr+1=Sr;
- ∀ i ∈ [ l , r ) , S i = S i + 1 \forall i\in[l,r),S_i=S_{i+1} ∀i∈[l,r),Si=Si+1。
定义 g ( S ) g(S) g(S) 为 S S S 的不同极长颜色段数。比如 g ( g( g( 00 \tt00 00 ) = 1 )=1 )=1, g ( g( g( 1110 \tt1110 1110 ) = 2 )=2 )=2, g ( g( g( 001011 \tt001011 001011 ) = 4 )=4 )=4。
定义 f ( n , m ) f(n,m) f(n,m) 的值为所有恰好包含 n \boldsymbol n n 个 0 \tt 0 0 和 m \boldsymbol m m 个 1 \tt 1 1 的 01 \tt 01 01 串 S S S 的 g ( S ) g(S) g(S) 之和。
你需要回答 T T T 个问题,每次给出 n , m n,m n,m 的值,求 f ( n , m ) f(n,m) f(n,m) 的值对 1 0 9 + 7 10^9+7 109+7 取模后的结果。
输入格式
第一行输入一个正整数数 T T T,表示问题个数。
接下来 T T T 行,每行两个非负整数 n , m n,m n,m,表示问题的参数。
输出格式
输出 T T T 行,每行为对应问题的答案。
样例 #1
样例输入 #1
3
2 2
4 6
7 8
样例输出 #1
18
1218
54483
样例 #2
样例输入 #2
3
845 826
672 826
618 925
样例输出 #2
789284214
588160420
730993180
样例 #3
样例输入 #3
1
1 46
样例输出 #3
139
提示
样例 1 解释
对于第一组数据 n = 2 , m = 2 n=2,m=2 n=2,m=2,一共有六个本质不同的 S S S,答案为 g ( g( g( 0011 \tt0011 0011 ) + g ( )+g( )+g( 0101 \tt0101 0101 ) + g ( )+g( )+g( 0110 \tt0110 0110 ) + g ( )+g( )+g( 1001 \tt1001 1001 ) + g ( )+g( )+g( 1010 \tt1010 1010 ) + g ( )+g( )+g( 1100 \tt1100 1100 ) = 2 + 4 + 3 + 3 + 4 + 2 = 18 )=2+4+3+3+4+2=18 )=2+4+3+3+4+2=18。
数据规模与约定
本题采用捆绑测试。
- Subtask 1(15 pts): 0 ≤ n + m ≤ 20 0 \le n+m \le 20 0≤n+m≤20, 1 ≤ T ≤ 10 1 \le T \le 10 1≤T≤10。
- Subtask 2(25 pts): 0 ≤ n + m ≤ 4 × 1 0 3 0 \le n+m \le 4 \times 10^3 0≤n+m≤4×103。
- Subtask 3(20 pts): 1 ≤ T ≤ 10 1 \le T \le 10 1≤T≤10。
- Subtask 4(40 pts):无特殊限制。
对于所有数据,保证 1 ≤ T ≤ 1 0 6 1 \leq T \leq 10^6 1≤T≤106, 0 ≤ n + m ≤ 2 × 1 0 6 0 \leq n+m\leq 2 \times 10^6 0≤n+m≤2×106, 0 ≤ n , m ≤ 2 × 1 0 6 0\le n,m\le 2\times10^6 0≤n,m≤2×106。
题解思路
问题描述
给定一个包含 n n n 个 0 和 $m个1的01` 串 S S S,定义 g ( S ) g(S) g(S) 为 S S S 的不同极长颜色段数。极长颜色段 [ l , r ] [l, r] [l,r] 需要满足以下条件:
- 如果 l ≠ 1 l \neq 1 l=1,则 S l − 1 ≠ S l S_{l-1} \neq S_l Sl−1=Sl;
- 如果 r ≠ ∣ S ∣ r \neq |S| r=∣S∣,则 S r + 1 ≠ S r S_{r+1} \neq S_r Sr+1=Sr;
- 对于所有 i ∈ [ l , r ) i \in [l, r) i∈[l,r), S i = S i + 1 S_i = S_{i+1} Si=Si+1。
定义 f ( n , m ) f(n, m) f(n,m) 为所有满足条件的 01 串 S S S 的 g ( S ) g(S) g(S) 之和,需要对 1 0 9 + 7 10^9 + 7 109+7 取模。
解题思路
1. 计算 g ( S ) g(S) g(S) 的贡献
对于任意一个 01 串 S S S, g ( S ) g(S) g(S) 可以通过以下方式计算:
- g ( S ) g(S) g(S) 等于 S S S 中满足 S i ≠ S i − 1 S_i \neq S_{i-1} Si=Si−1 的位置 i i i 的数量,再加上 1 1 1。
2. 贡献分解
将 f ( n , m ) f(n, m) f(n,m) 的贡献分解为两部分:
- 基础的贡献:每个
01串 S S S 的基础贡献为 1 1 1,因为 g ( S ) g(S) g(S) 至少包含一个极长颜色段。总共有 ( n + m n ) \binom{n + m}{n} (nn+m) 个01串,因此这部分的总贡献为:
( n + m n ) \binom{n + m}{n} (nn+m) - 变化的贡献:对于每个位置 i i i,如果 S i ≠ S i − 1 S_i \neq S_{i-1} Si=Si−1,则会对 g ( S ) g(S) g(S) 产生额外的贡献。对于每个位置 i i i, S i − 1 S_{i-1} Si−1 和 S i S_i Si 可以是
01或10,其余 ∣ S ∣ − 2 |S| - 2 ∣S∣−2 个位置可以任意排列。因此,每个位置 i i i 的贡献为:
2 × ( n + m − 2 n − 1 ) 2 \times \binom{n + m - 2}{n - 1} 2×(n−1n+m−2)
由于总共有 n + m − 1 n + m - 1 n+m−1 个可能的位置 i i i,因此这部分的总贡献为:
( n + m − 1 ) × 2 × ( n + m − 2 n − 1 ) (n + m - 1) \times 2 \times \binom{n + m - 2}{n - 1} (n+m−1)×2×(n−1n+m−2)
3. 总贡献
将两部分贡献相加,得到 f ( n , m ) f(n, m) f(n,m) 的表达式:
f ( n , m ) = ( n + m n ) + ( n + m − 1 ) × 2 × ( n + m − 2 n − 1 ) f(n, m) = \binom{n + m}{n} + (n + m - 1) \times 2 \times \binom{n + m - 2}{n - 1} f(n,m)=(nn+m)+(n+m−1)×2×(n−1n+m−2)
4. 模运算
由于结果需要对 1 0 9 + 7 10^9 + 7 109+7 取模,因此在计算组合数时需要使用模运算和预处理阶乘及其逆元来高效计算组合数。
总结
通过将 f ( n , m ) f(n, m) f(n,m) 的贡献分解为基础贡献和变化贡献,并利用组合数学的知识,可以高效地计算出 f ( n , m ) f(n, m) f(n,m) 的值。最终的结果需要对 1 0 9 + 7 10^9 + 7 109+7 取模,以确保结果的正确性。
代码:
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define pb push_back
#define pii pair<int, int>
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
#define FU(i, a, b) for (int i = (a); i <= (b); ++i)
#define FD(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;const int MAX = 2000000 + 10; // 2e6 + 10
long long fact[MAX], inv_fact[MAX];long long qpow(long long a, long long b) { // 快速幂long long res = 1;while (b > 0) {if (b & 1)res = res * a % MOD;a = a * a % MOD;b >>= 1;}return res;
}void precompute() { // 预处理阶乘和阶乘逆元fact[0] = 1;for (int i = 1; i < MAX; ++i) {fact[i] = fact[i - 1] * i % MOD;}inv_fact[MAX - 1] = qpow(fact[MAX - 1], MOD - 2);for (int i = MAX - 2; i >= 0; --i) {inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;}
}long long comb(int a, int b) { // 计算组合数if (b < 0 || b > a)return 0;return fact[a] * inv_fact[b] % MOD * inv_fact[a - b] % MOD;
}void solve() {int n, m;cin >> n >> m;if (n == 0 || m == 0) {printf("1\n");return;}int a = n + m;int term1 = (a - 1) * 2 % MOD;term1 = term1 * comb(a - 2, n - 1) % MOD;int term2 = comb(a, n) % MOD;int ans = (term1 + term2) % MOD;cout << ans << endl;
}signed main() {cin.tie(0)->ios::sync_with_stdio(0);precompute();int T = 1;cin >> T;while (T--) {solve();}return 0;
}
相关文章:
洛谷P11655「FAOI-R5」Lovely 139
P11655「FAOI-R5」Lovely 139 题目背景 Update:数据有 0 0,答案为 1,请选手特判以正常通过。 Height ≤ 139 \text{Height}\leq139 Height≤139。 题目描述 对于一个 01 \tt 01 01 串 S S S(下标从 1 1 1 开始)…...
文字显示省略号
多行文本溢出显示省略号...
Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget? 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…...
C++11 多线程 锁与条件变量:mutex、lock_guard、unique_lock 和 condition_variable
文章目录 mutex核心成员函数使用场景 lock_guard功能和特性构造函数使用场景 unique_lock功能和特性构造函数核心成员函数使用场景 lock_guard对比unique_lockcondition_variable核心成员函数使用场景 mutex std::mutex 是 C 标准库中提供的一种互斥量,用于在多线程…...
【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示
本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...
Cosmos - 世界模型开发平台
文章目录 一、关于 Cosmos主要特点模型家族 二、使用示例1、推理2、后训练 许可证和联系方式 一、关于 Cosmos NVIDIA Cosmos是开发者第一的世界基础模型平台,旨在帮助物理AI开发者更好、更快地构建他们的物理AI系统。宇宙包含 预训练模型,可通过拥抱脸…...
图像分割中根据mask的ROI,去除mask和image中没有勾画ROI层数以外的图像
在分割任务中,一个患者有很多层图像,但是勾画的ROI仅有那么几层。我想去除ROI以外层数的那些没用的图像。这里以一个36张图像的nii格式数据为例 查看一下mask文件中有多少个非0图像 import nibabel as nib import numpy as np# 加载 .nii 文件 file_pat…...
【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法
在 Java 开发中,基本数据类型与字符串之间的转换是非常常见的操作。无论是从用户输入中读取数据,还是将数据输出到日志或界面,都需要进行数据类型与字符串之间的转换。本文将深入探讨 Java 中基本数据类型与字符串之间的转换方法,…...
全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)
目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式,由于跨域资源共享(cors)是浏览器的一种安全机制,它会阻止前端应用…...
springboot使用rabbitmq
使用springboot创建rabbitMQ的链接。 整个项目结构如下: 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…...
Linux——ext2文件系统(二)
Linux——ext2文件系统 ext2文件系统宏观认识一、磁盘分区与格式化二、块组(Block Group)结构三、文件系统特性 文件名与目录名与inode一、inode的作用原理二、文件与目录名与inode的关系 路径一,路径解析二,路径缓存三࿰…...
动手学深度学习-3.2 线性回归的从0开始
以下是代码的逐段解析及其实际作用: 1. 环境设置与库导入 %matplotlib inline import random import torch from d2l import torch as d2l作用: %matplotlib inline:在 Jupyter Notebook 中内嵌显示 matplotlib 图形。random:生成…...
“深度强化学习揭秘:掌握DQN与PPO算法的精髓“
深度Q网络(Deep Q-Network,简称DQN)是一种结合了Q学习和深度神经网络的强化学习算法。它使用神经网络来近似Q值函数,从而实现对复杂状态空间中的动作选择。DQN的核心思想是通过贝尔曼方程(Bellman Equation)…...
如何让DeepSeek恢复联网功能?解决(由于技术原因,联网搜索暂不可用)
DeekSeek提示:(由于技术原因,联网搜索暂不可用) 众所周知,因为海外黑客的ddos攻击、僵尸网络攻击,deepseek的联网功能一直处于宕机阶段,但是很多问题不联网出来的结果都还是2023年的,…...
Unity-编译构建Android的问题记录
文章目录 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout报错信息解读:原因分析最终处理方法 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 报错信息解读࿱…...
python的ruff简单使用
Ruff 是一个用 Rust 编写的高性能 Python 静态分析工具和代码格式化工具。它旨在提供快速的代码检查和格式化功能,同时支持丰富的配置选项和与现有工具的兼容性。ruff是用rust实现的python Linter&Formatter。 安装: conda install -c conda-forge…...
Docker 部署 GLPI(IT 资产管理软件系统)
GLPI 简介 GLPI open source tool to manage Helpdesk and IT assets GLPI stands for Gestionnaire Libre de Parc Informatique(法语 资讯设备自由软件 的缩写) is a Free Asset and IT Management Software package, that provides ITIL Service De…...
【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)
范数惩罚的作用与原理 范数惩罚(Norm Penalty) 是一种常用于机器学习模型中的正则化技术,它的主要目的是控制模型复杂度,防止过拟合。通过对模型的参数进行惩罚(即在损失函数中加入惩罚项),使得…...
【C++ STL】vector容器详解:从入门到精通
【C STL】vector容器详解:从入门到精通 摘要:本文深入讲解C STL中vector容器的使用方法,涵盖常用函数、代码示例及注意事项,助你快速掌握动态数组的核心操作! 一、vector概述 vector是C标准模板库(STL&am…...
LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略
LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列:OpenAI o3-mini的简介、安…...
Notepad++消除生成bak文件
设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示...
后台管理系统通用页面抽离=>高阶组件+配置文件+hooks
目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…...
Spring Boot项目如何使用MyBatis实现分页查询
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
[Java]多态
1. 多态的基本概念 1.1 定义: 多态是指同一操作作用于不同的对象时,能够表现出不同的行为。多态通常通过以下两种方式实现: 方法重载(Overloading)方法重写(Overriding) 1.2 示例࿱…...
用Impala对存储在HDFS中的大规模数据集进行快速、实时的交互式SQL查询的具体步骤和关键代码
AWS EMR(Elastic MapReduce)中应用Impala的典型案例,主要体现在大型企业和数据密集型组织如何利用Impala对存储在Hadoop分布式文件系统(HDFS)中的大规模数据集进行快速、实时的交互式SQL查询。以下是一个具体的案例说明…...
Intellij 插件开发-快速开始
目录 一、开发环境搭建以及创建action1. 安装 Plugin DevKit 插件2. 新建idea插件项目3. 创建 Action4. 向新的 Action 表单注册 Action5. Enabling Internal Mode 二、插件实战开发[不推荐]UI Designer 基础JBPanel类(JPanel面板)需求:插件设…...
GIt使用笔记大全
Git 使用笔记大全 1. 安装 Git 在终端或命令提示符中,输入以下命令检查是否已安装 Git: git --version如果未安装,可以从 Git 官方网站 下载并安装适合你操作系统的版本。 2. 配置 Git 首次使用 Git 时,需要配置用户名和邮箱…...
语言月赛 202412【题目名没活了】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202412] 题目名没活了 题目描述 在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当: 在本次提交以前&…...
MySQL锁类型(详解)
锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…...
面经--C语言——static,volatile,malloc,使用异或进行数据交换
文章目录 static静态变量和全局变量的区别volatile主要作用 malloc1. 内存分配器的作用2. 内存分配过程(1) 查找空闲内存块(2) 扩展堆空间(3) 元数据 3. 内存释放过程(1) 标记为可用(2) 合并相邻空闲块(3) 延迟释放 4. 内存管理策略(1) 分配缓存(Allocation Caching…...
