题解:P11655 「FAOI-R5」Lovely 139
yezicong1104 · · 题解
题目描述
对于一个
- 若
l \ne 1 ,S_{l-1} \ne S_l ; - 若
r \ne \lvert S \rvert ,S_{r+1} \ne S_r ; -
定义
定义
回答
样例
输入
3
2 2
4 6
7 8
输出
18
1218
54483
算法
(组合计数、逆元)
易得
先考虑
在
综上所述,答案为
预处理
时间复杂度 O(T)
C++ 代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 2000010, MOD = 1e9 + 7;
int fac[N], inv[N], facinv[N];
LL C(int n, int m) { //计算组合数
return (LL)fac[m] * facinv[m - n] % MOD * facinv[n] % MOD;
}
int main() {
fac[0] = facinv[0] = inv[1] = 1; //初始化
for (int i = 1; i < N; i++) //计算阶乘数组
fac[i] = (LL)fac[i - 1] * i % MOD;
for (int i = 2; i < N; i++) //计算逆元数组
inv[i] = MOD - (LL)inv[MOD % i] * (MOD / i) % MOD;
for (int i = 1; i < N; i++) //计算阶乘的逆元数组
facinv[i] = (LL)facinv[i - 1] * (LL)inv[i] % MOD; //逆元的地推公式
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
int ans = 0;
if (!n || !m) { //特判
puts("1");
continue;
}
//计算答案
ans = (2ll * (n + m - 1) * C(n - 1, m + n - 2) % MOD + C(n, n + m)) % MOD;
printf("%d\n", ans);
}
return 0;
}