组合
不会组合,还不是因为自己不够努力
CF1747E List Generation
这个题意其实就事从
考虑暴力组合数,考虑跳了
先把没什么关系的
然后把组合数简单变换一下,变为:
继续化简,发现
转化后并把只关于
对于后面的式子,考虑继续化简,并考虑其组合意义:在
考虑一部选到位,并枚举
那么答案即为:
时间复杂度
const int N = 1e7 + 5;
const int P = 1e9 + 7;
int add(int x, int y) { return (x + y < P ? x + y : x + y - P); }
void Add(int &x, int y) { x = (x + y < P ? x + y : x + y - P); }
int mul(int x, int y) { return (1ll * x * y) % P; }
void Mul(int &x, int y) { x = (1ll * x * y) % P; }
int fp(int x, int y) {
int res = 1;
for(; y; y >>= 1) {
if(y & 1) Mul(res, x);
Mul(x, x);
}
return res;
}
int n, m;
int fac[N], finv[N], pw[N];
void init(int n) {
fac[0] = pw[0] = 1;
FOR(i, 1, n) pw[i] = add(pw[i - 1], pw[i - 1]);
FOR(i, 1, n) fac[i] = mul(fac[i - 1], i);
finv[n] = fp(fac[n], P - 2);
ROF(i, n - 1, 0) finv[i] = mul(finv[i + 1], i + 1);
}
int C(int x, int y) {
if(x < y || y < 0) return 0;
return mul(mul(fac[x], finv[y]), finv[x - y]);
}
void solve() {
cin >> n >> m;
init(n + m);
int ans = 0;
FOR(i, 1, n)
Add(ans, mul(
mul(C(n - 1, i - 1), (i + 1)),
add(
mul(C(i + m - 1, i + 1), pw[m - 2]),
mul(C(i + m, i), pw[m])
)
));
cout << ans << endl;
}