[Keyence2019] Paper Cutting
Paper Cutting
题面翻译
有一个
你需要执行
定义一个操作序列的权值为
求所有操作序列的权值之和,答案对
其中
Solution
考虑单次操作的贡献是什么,假设当前为第
而这次操作的贡献为:
那么贡献即为:
序列个数不难
化式子:
前半部分直接使用范德蒙德卷积,后半部分拆一下组合数:
同样使用范德蒙德卷积可以得到:
显然可以
时间复杂度
Code
int N, M, K;
mint fac[_N], ifac[_N];
void init(int n) {
fac[0] = 1; For(i, 1, n) fac[i] = fac[i-1] * i;
ifac[n] = 1 / fac[n]; Rof(i, n, 1) ifac[i-1] = ifac[i] * i;
}
mint binom(int x, int y) {
if (x < y || y < 0) return 0;
return fac[x] * ifac[y] * ifac[x-y];
}
void _() {
cin >> N >> M >> K; init(N + M);
mint ans = 0;
For(k, 1, K) {
mint tmp = fac[k] * fac[K - k] * binom(N + M - k, K - k);
tmp *= (k + 1) * binom(N + M, k) + binom(N + M - 2, k - 2) * N * M;
ans += tmp;
}
cout << ans << '\n';
}
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步