洛谷P11655「FAOI-R5」Lovely 139

P11655「FAOI-R5」Lovely 139

题目背景

Update:数据有 0 0,答案为 1,请选手特判以正常通过。

Height ≤ 139 \text{Height}\leq139 Height139

题目描述

对于一个 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 Sl1=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 0n+m20 1 ≤ T ≤ 10 1 \le T \le 10 1T10
  • Subtask 2(25 pts): 0 ≤ n + m ≤ 4 × 1 0 3 0 \le n+m \le 4 \times 10^3 0n+m4×103
  • Subtask 3(20 pts): 1 ≤ T ≤ 10 1 \le T \le 10 1T10
  • Subtask 4(40 pts):无特殊限制。

对于所有数据,保证 1 ≤ T ≤ 1 0 6 1 \leq T \leq 10^6 1T106 0 ≤ n + m ≤ 2 × 1 0 6 0 \leq n+m\leq 2 \times 10^6 0n+m2×106 0 ≤ n , m ≤ 2 × 1 0 6 0\le n,m\le 2\times10^6 0n,m2×106

题解思路

问题描述

给定一个包含 n n n0 和 $m101` 串 S S S,定义 g ( S ) g(S) g(S) S S S 的不同极长颜色段数。极长颜色段 [ l , r ] [l, r] [l,r] 需要满足以下条件:

  1. 如果 l ≠ 1 l \neq 1 l=1,则 S l − 1 ≠ S l S_{l-1} \neq S_l Sl1=Sl
  2. 如果 r ≠ ∣ S ∣ r \neq |S| r=S,则 S r + 1 ≠ S r S_{r+1} \neq S_r Sr+1=Sr
  3. 对于所有 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=Si1 的位置 i i i 的数量,再加上 1 1 1

2. 贡献分解

f ( n , m ) f(n, m) f(n,m) 的贡献分解为两部分:

  1. 基础的贡献:每个 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)
  2. 变化的贡献:对于每个位置 i i i,如果 S i ≠ S i − 1 S_i \neq S_{i-1} Si=Si1,则会对 g ( S ) g(S) g(S) 产生额外的贡献。对于每个位置 i i i S i − 1 S_{i-1} Si1 S i S_i Si 可以是 0110,其余 ∣ S ∣ − 2 |S| - 2 S2 个位置可以任意排列。因此,每个位置 i i i 的贡献为:
    2 × ( n + m − 2 n − 1 ) 2 \times \binom{n + m - 2}{n - 1} 2×(n1n+m2)
    由于总共有 n + m − 1 n + m - 1 n+m1 个可能的位置 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+m1)×2×(n1n+m2)

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+m1)×2×(n1n+m2)

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12140.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes学习之包管理工具(Helm)

一、基础知识 1.如果我们需要开发微服务架构的应用&#xff0c;组成应用的服务可能很多&#xff0c;使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理&#xff0c;此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构&#xff1a; chart:一个应用的信息集合…

Kamailio 不通过 dmq 实现注册复制功能

春节期间找到一篇文章&#xff0c;需要 fg 才能看到&#xff1a; https://medium.com/tumalevich/kamailio-registration-replication-without-dmq-65e225f9a8a7 kamailio1 192.168.56.115 kamailio2 192.168.56.116 kamailio3 192.168.56.117 route[HANDLE_REPLICATION] {i…

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议&#xff0c;各自适用于不同的场景。以下是它们的详细对比与优势分析&#xff1a; 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf&#xff08;二进制&#xff09;通常使用 JSON/…

Intel 与 Yocto 项目的深度融合:全面解析与平台对比

在嵌入式 Linux 领域&#xff0c;Yocto 项目已成为构建定制化 Linux 发行版的事实标准&#xff0c;广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者&#xff0c;在 Yocto 生态中投入了大量资源&#xff0c;为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…

kubernetes(二)

文章目录 NamespacePodLabelDeploymentService Namespace 在Kubernetes系统中&#xff0c;Namespace是一种至关重要的资源类型&#xff0c;其主要功能在于实现多套环境的资源隔离或者多租户的资源隔离&#xff0c;默认情况下所有的Pod都能够相互访问&#xff0c;但如果不想让两…

巧妙利用数据结构优化部门查询

目录 一、出现的问题 部门树接口超时 二、问题分析 源代码分析 三、解决方案 具体实现思路 四、优化的效果 一、出现的问题 部门树接口超时 无论是在A项目还是在B项目中&#xff0c;都存在类似的页面&#xff0c;其实就是一个部门列表或者叫组织列表。 从页面的展示形式…

【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟&#xff0c;用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时&#xff0c;头和尾都指向同一个位置。当环形队列为满时&#xff0c;头和尾也都指向同一个位置。 因此&#xff0c; 可以通过加计数器或者标记…

Vue指令v-html

目录 一、Vue中的v-html指令是什么&#xff1f;二、v-html指令与v-text指令的区别&#xff1f; 一、Vue中的v-html指令是什么&#xff1f; v-html指令的作用是&#xff1a;设置元素的innerHTML&#xff0c;内容中有html结构会被解析为标签。 二、v-html指令与v-text指令的区别…

OPENGLPG第九版学习 - 着色器基础

文章目录 2.1 着色器与OpenGL2.2 0penGL的可编程管线2.3 OpenGL着色语言GLSL概述2.3.1 使用GLSL构建着色器变量的声明变量的作用域变量的初始化构造函数 、 类型转换聚合类型访问向量和矩阵中的元素结构体数组多维数组 2.3.2 存储限制符const 存储限制符in 存储限制符out 存储限…

路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)

鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…

Docker Compose的使用

文章首发于我的博客&#xff1a;https://blog.liuzijian.com/post/docker-compose.html 目录 Docker Compose是什么Docker Compose安装Docker Compose文件Docker Compose常用命令案例&#xff1a;部署WordPress博客系统 Docker Compose是什么 Docker Compose是Docker官方的开源…

AP单类平均准确率

P_true N_true P_pred TP Fp N_pred FN TNP NTP&#xff08;真正样本&#xff0c;与真实框IoU大于阈值的框&#xff09; FP&#xff08;假正样本&#xff0c;与真实框IoU小于阈值的框&#xff09; TN&#xff08;真负样本&#xff0c;背景&#xff09;…

Leetcode—1427. 字符串的左右移【简单】Plus

2025每日刷题&#xff08;206&#xff09; Leetcode—1427. 字符串的左右移 实现代码 class Solution { public:string stringShift(string s, vector<vector<int>>& shift) {// shift[i] [dir, amount]// dir 0(左) or 1(右)// 左表示正, 右表示负int len…

机器学习10

自定义数据集 使用scikit-learn中svm的包实现svm分类 代码 import numpy as np import matplotlib.pyplot as pltclass1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])class2_points np.array([[3.2, 3.2],[3.7, 2.9],…

股票入门知识

股票入门&#xff08;更适合中国宝宝体制&#xff09; 股市基础知识 本文介绍了股票的基础知识&#xff0c;股票的分类&#xff0c;各板块发行上市条件&#xff0c;股票代码&#xff0c;交易时间&#xff0c;交易规则&#xff0c;炒股术语&#xff0c;影响股价的因素&#xf…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…

C#,入门教程(11)——枚举(Enum)的基础知识和高级应用

上一篇&#xff1a; C#&#xff0c;入门教程(10)——常量、变量与命名规则的基础知识https://blog.csdn.net/beijinghorn/article/details/123913570 不会枚举&#xff0c;就不会编程&#xff01; 枚举 一个有组织的常量系列 比如&#xff1a;一个星期每一天的名字&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上&#xff0c;主要对分布式应用架构下的异步化机制和缓存技术进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。大家知道原来传统的单一WAR应用中&#xff0c;由于所有数据都在同一个数据库中&#xff0c;因此事务问题一般借助数据库事…

【C++】继承(下)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的继承&#xff08;下&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承8.继…