CF1278F题解

这不是傻逼题吗??????

考虑到第一张是王牌的概率为 \(\frac{1}{m}\),答案就是:

\[\sum_{i=0}^n\binom{n}{i}(\frac{1}{m})^i(1-\frac{1}{m})^{n-i}i^k \]

我们设 \(f(x)=x^k,x=\frac{1}{m}\)

\[\sum_{i=0}^n\binom{n}{i}f(i)x^i(1-x)^{n-i} \]

然后变成 LGP6667 如何优雅地求和。

那题的瓶颈在于转化下降幂多项式,这题轻松计算出点值,然后随便一卷就行了。

复杂度 \(O(k\log k)\)

这个在原题是存在线性做法的。

然后考虑做到 \(O(k)\)

把柿子写出来:\(\sum_{i=0}^kf_in^{\underline{i}}x^i\)

计算点值对其的贡献:

\[\frac{f(i)}{i!}e^{-x}=\frac{f(i)}{i!}\sum_{j=0}^{m-i}\frac{(-1)^j}{j!}x^{i+j} \]

丢到上面的柿子里面就是:

\[\frac{1}{i!}\sum_{j=i}^m\frac{(-1)^{j-i}}{(j-i)!}n^{\underline{j}}x^j \]

\[\frac{1}{i!}\sum_{j=i}^m\frac{(-1)^{j-i}}{(j-i)!}n^{\underline{i}}(n-i)^{\underline{j-i}}x^j \]

\[\frac{n^{\underline{i}}}{i!}\sum_{j=0}^{m-i}\binom{n-i}{j}(-1)^jx^{i+j} \]

考虑后面这个玩意儿 \(g_k=\sum_{i=0}^{m-k}\binom{n-k}{i}(-1)^ix^{i+k}\)

直接把组合数拆成递推:

\[\sum_{i=0}^{m-k}\binom{n-k-1}{i}(-1)^ix^{i+k}+\sum_{i=1}^{m-k}\binom{n-k-1}{i-1}(-1)^ix^{i+k} \]

\[(-1)^{m-i}\binom{n-k-1}{m-k}x^m+\frac{1}{x}g_{k+1}-g_{k+1} \]

特判 \(m=1\),然后没了。

别忘了这是点值的贡献,答案是 \(\sum_{i=0}^ki^kg_i\)

代码基本上是贺的sk的,别看了

#include<cstdio>
typedef unsigned ui;
const ui M=1e7+5,mod=998244353;
ui n,m,k,top,g[M],pri[M],idk[M],inv[M],ifac[M];bool zhi[M];
inline ui pow(ui a,ui b){
	ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
inline void sieve(const ui&M){
	idk[1]=1;
	for(ui i=2;i<=M;++i){
		if(!zhi[i])pri[++top]=i,idk[i]=pow(i,k);
		for(ui x,j=1;j<=top&&(x=i*pri[j])<=M;++j){
			idk[x]=1ull*idk[i]*idk[pri[j]]%mod;if(!(i%pri[j]))break;
		}
	}
}
signed main(){
	ui ans(0);
	scanf("%u%u%u",&n,&m,&k);
	if(m==1)return printf("%u",pow(n,k)),0;
	m=pow(m,mod-2);sieve(k);inv[0]=inv[1]=1;ifac[0]=1;
	for(ui i=2;i<=k;++i)inv[i]=1ull*(mod-mod/i)*inv[mod%i]%mod;
	for(ui i=1;i<=k;++i)ifac[i]=1ull*ifac[i-1]*inv[i]%mod;
	ui c1(1),c2(pow(m-1,mod-2));
	for(ui i=0;i<=k;++i){
		if(i&1)g[0]=(g[0]+1ull*(mod-c1)*ifac[i])%mod;
		else g[0]=(g[0]+1ull*c1*ifac[i])%mod;
		c1=1ull*c1*m%mod*(mod+n-i)%mod;
	}
	for(ui i=1;i<=k;++i){
		g[i]=((mod+n-i+1ull)*m%mod*g[i-1]+1ull*ifac[i-1]*ifac[k-i+1]%mod*(k-i&1?mod-c1:c1))%mod*(mod-c2)%mod*inv[i]%mod;
	}
	for(ui i=1;i<=k;++i)ans=(ans+1ull*idk[i]*g[i])%mod;
	printf("%u",ans);
}
posted @ 2022-03-02 21:58  Prean  阅读(32)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};