本意是 组合数,没想到数据太水,让
组合数过了,在此谢罪了。
设 表示最大数为
, 长度为
的不下降正整数数列的个数。
| x\y | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
| 2 | 1 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | ||
| 3 | 1 | 4 | 10 | 20 | 35 | 56 | 84 | 120 | 165 | |||
| 4 | 1 | 5 | 15 | 35 | 70 | 126 | 210 | 330 | ||||
| 5 | 1 | 6 | 21 | 56 | 126 | 252 | 462 | |||||
| 6 | 1 | 7 | 28 | 84 | 210 | 462 | ||||||
| 7 | 1 | 8 | 36 | 120 | 330 | |||||||
| 8 | 1 | 9 | 45 | 165 | ||||||||
| 9 | 1 | 10 | 55 | |||||||||
| 10 | 1 | 22 | ||||||||||
| 11 | 1 |
由
看出 是杨辉三角的第
行,第
列
而杨辉三角第 行,第
列代表
易得出
而原问题可转为最大数为 , 长度为
的不下降正整数数列。
故原问题的公式为 。
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
typedef long long LL;
const int maxn = 2e6, mod = 911451407;
int re[maxn + 10], inv[maxn + 10], fac[maxn + 10];
inline void init(int n) {
re[0] = inv[1] = fac[0] = re[1] = fac[1] = 1;
for (int i = 2; i <= n; ++i) {
fac[i] = (LL)fac[i - 1] * i % mod;
inv[i] = (LL)(mod - mod / i) * inv[mod % i] % mod;
re[i] = (LL)re[i - 1] * inv[i] % mod;
}
}
inline int C(int a,int b) {
if (a < b) return 0;
return (LL)fac[a] * re[b] % mod * re[a - b] % mod;
}
int main() {
ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
init(2e6);
int T;
cin >> T;
int l, x;
do {
cin >> l >> x;
--l;
cout << C(l + x - 1, x - 1) << '\n';
} while (--T);
return 0;
} 
京公网安备 11010502036488号