P6031 CF1278F Cards 加强版
推式子
有答案为
的上限为 ,交换求和顺序不好优化,看到 ,试试第二类斯特林数
第二个求和符号后面只有 受 限制,而前面有 ,考虑恒等式(组合意义即可)
代回原式即可把后一部分提前
第二行把 ,然后二项式定理合并了第二个求和式子
此时已经有了 的做法了,多项式卷积直接弄出
不过可以更优,上式瓶颈在 中,考虑用容斥把 拆开
那么
第二行同样是把 ,然后出现的 同样处理,并提前枚举
前一个求和可以线筛预处理
考虑后面的求和式子,记为 ,找到一种递推关系 预处理
处理手段是把组合数按帕斯卡公式展开
那么
第二行把 ,然后单独提出 的式子,发现又出现了个
于是可以 递推了
恰当处理组合数即可
写到累死
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int P = 998244353, N = 1e7 + 5; LL n, m, K; int sgn[2] = {1, P - 1}; int f[N], idk[N], inv[N], vis[N], pr[N / 5], tot; void Add(int &x, int y){((x += y) >= P) && (x -= P);} int fpow(int x, int y) { int s = 1; for(; y; y >>= 1, x = (LL)x * x % P) if (y & 1) s = (LL)s * x % P; return s; } void init() { inv[0] = inv[1] = idk[1] = 1; for(int i = 2; i <= K + 1; ++i) inv[i] = (LL)(P - P / i) * inv[P % i] % P; for(int i = 2; i <= K + 1; ++i) { if (!vis[i]) pr[++tot] = i, idk[i] = fpow(i, K); for(int j = 1; j <= tot && i * pr[j] <= N - 5; ++j) { vis[i * pr[j]] = 1, idk[i * pr[j]] = (LL)idk[i] * idk[pr[j]] % P; if (!(i % pr[j])) break; } } } int main() { scanf("%lld%lld%lld", &n, &m, &K), init(); int invm = fpow(m, P - 2), c = 1; f[K] = (LL)fpow(invm, K) * sgn[K & 1] % P; for(int i = K - 1; i; --i) { c = (LL)c * (n - i - 1 + P) % P * inv[K - i] % P; f[i] = (LL)f[i + 1] * (1LL - m + P) % P; Add(f[i], (LL)f[K] * c % P); } c = 1; int ans = 0; for(int i = 1; i <= K; ++i) { c = (LL)c * (n - i + 1) % P * inv[i] % P; Add(ans, (LL)idk[i] * sgn[i & 1] % P * c % P * f[i] % P); } printf("%d\n", ans); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具