P6031 CF1278F Cards 加强版

Solution

推式子
有答案为

Ans=i=0nik(ni)(1m)i(11m)ni

i 的上限为 n,交换求和顺序不好优化,看到 ik,试试第二类斯特林数

i=0nik(ni)(1m)i(11m)ni=i=0n(ni)(1m)i(11m)nij=0k{kj}j!(ij)

第二个求和符号后面只有 (ij)i 限制,而前面有 (ni),考虑恒等式(组合意义即可)

(ni)(ij)=(nj)(njij)=(nj)(njni)

代回原式即可把后一部分提前

i=0n(ni)(1m)i(11m)nij=0k{kj}j!(ij)=j=0k{kj}j!(nj)i=jn(njij)(1m)i(11m)ni=j=0k{kj}j!(nj)i=0nj(nji)(1m)i+j(11m)nji=j=0k{kj}j!(nj)mj

第二行把 (ij)i,然后二项式定理合并了第二个求和式子
此时已经有了 O(klogk) 的做法了,多项式卷积直接弄出 Sk

不过可以更优,上式瓶颈在 Sk 中,考虑用容斥把 Sk 拆开

{kj}=1j!i=0j(1)j(ji)(ji)k

那么

j=0k{kj}j!(nj)mj=j=0k(nj)mji=0j(1)j(ji)(ji)k=j=0k(nj)mji=0j(1)ji(ji)ik=i=0kik(1)i(ni)j=ik(ninj)(1m)j(1)j

第二行同样是把 (ji)i,然后出现的 (nj)(ji) 同样处理,并提前枚举 i
前一个求和可以线筛预处理 ik
考虑后面的求和式子,记为 f(i),找到一种递推关系 O(k) 预处理
处理手段是把组合数按帕斯卡公式展开
那么

f(i)=j=ik(ninj)(1m)j(1)j=f(i+1)+j=ik(ni1nj1)(1m)j(1)j=f(i+1)+j=i+1k+1(ni1nj)(1m)j1(1)j1=(1m)f(i+1)+(ni1nk1)(1m)k(1)k

第二行把 (j+1)j,然后单独提出 j=k+1 的式子,发现又出现了个 f(i+1)
于是可以 O(k) 递推了
恰当处理组合数即可

写到累死

Code

#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);
}
posted @   leiyuanze  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示