题解:P11487 「Cfz Round 5」Gnirts 10
题目链接:「Cfz Round 5」Gnirts 10
一道组合数学题。
场上对着一个错的式子 Debug 了两个小时,这下消愁了。
设
考虑怎么求
首先,
接下来考虑怎么插使得
若
可以看作把相同的
若
综上可得:
最终答案即为
预处理阶乘及其逆元,时间复杂度
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 2933256077;
int n, m, len, ans, cnt0, cnt1, fac[6000005], inv[6000005], facinv[6000005];
char c[6000005];
int C(int x, int y)
{
if (x == y) return 1;
if (x < y) return 0;
if (y < 0) return 0;
return (fac[x] * facinv[x - y] % mod) * facinv[y] % mod;
}
signed main()
{
fac[0] = 1;
for (int i = 1; i <= 6000000; i++)
fac[i] = (fac[i - 1] * i) % mod;
inv[1] = 1;
for (int i = 2; i <= 6000000; i++)
inv[i] = mod - inv[mod % i] * (mod / i) % mod;
facinv[0] = 1;
for (int i = 1; i <= 6000000; i++)
facinv[i] = facinv[i - 1] * inv[i] % mod;
cin >> n >> m;
len = n + m;
for (int i = 1; i <= len; i++)
cin >> c[i];
for (int i = 1; i <= len; i++)
{
if (c[i] == '0') cnt0++;
else cnt1++;
int cur;
if (c[i + 1] == '0') cur = C(m - cnt0 + cnt1 - 1, cnt1 - 1) * C(n - cnt1 + cnt0, cnt0) % mod;
else cur = C(n - cnt1 + cnt0 - 1, cnt0 - 1) * C(m - cnt0 + cnt1, cnt1) % mod;
ans = (ans + i * cur) % mod;
}
cout << ans << endl;
return 0;
}