CF923E题解

当初学 GF 的时候被 rqy 当做例题,然后今天被教练当做 PGF 例题

不过y1s1这题真的和 PGF 没啥关系吧

\(p_{k,i}\)\(k\) 次操作后 \(x=i\) 的概率,\(P_k(x)=\sum p_{k,i}x^i\)

考虑组合(概率?)意义有:

\[p_{k,i}=\sum_{i\leq j}\frac{p_{k-1,j}}{j+1} \]

这里不能直接写成积分+位移,因为要做 \(m\) 次不好化简。

因此考虑用 \(P_{k-1}(x)\) 的系数去表达 \(P_k(x)\)(为了方便暂时设一个 \(f_i=p_{k-1,i}\)):

\[\sum_{i=0}^{n}\sum_{j=i}^{n}\frac{f_j}{j+1}x^i \]

\[\sum_{j=0}^{n}\frac{f_j}{j+1}\sum_{i=0}^{j}x^i \]

\[\sum_{i=0}^{n}\frac{f_i}{i+1}\frac{x^{i+1}-1}{x-1} \]

\[\frac{1}{x-1}\sum_{i=0}^{n}f_i\times(\frac{x^{i+1}}{i+1}-\frac{1^{i+1}}{i+1}) \]

\(\frac{x^{i+1}}{i+1}\) 看做 \(\int x^i{\rm d}x\),那么有:

\[\frac{1}{x-1}\sum_{i=0}^{n}f_i\int_1^{x}y^i{\rm d}y \]

\[\frac{1}{x-1}\int_1^{x}\sum_{i=0}^{n}f_iy^i{\rm d}y \]

\[\frac{1}{x-1}\int_1^{x}P_{k-1}(y){\rm d}y \]

但是我们只会做 \(\int_0^{x}\) 啊,所以考虑通过换元将积分变成 \(\int_0^{x}\)
\(Q_k(x)=P_k(x+1)\),那么有:

\[P_k(x)=\frac{1}{x-1}\int_1^{x}P_{k-1}(y){\rm d}y \]

\[P_k(x+1)=\frac{1}{x+1-1}\int_1^{x+1}P_{k-1}(y+1){\rm d}y \]

\[Q_k(x)=\frac{1}{x}\int_0^{x}Q_{k-1}(y){\rm d}y \]

得到:

\[[x^n]Q_k(x)=\frac{[x^n]Q_{k-1}(x)}{n+1} \]

于是将 \(P_0(x)\to Q_0(x)\to Q_m(x)\to P_m(x)\) 即可。

做差卷积。

#include<cstdio>
#define IMP(lim,act) for(int qwq=(lim),i=0;i^qwq;++i)act
const int M=1<<18|5,mod=998244353;
int n,m,f[M];int inv[M],fac[M],ifac[M],buf[M<<1],*w[20];long long k;
int top,pri[M],pos[M],idk[M];
inline int Getlen(const int&n){
	int len(0);while((1<<len)<n)++len;return len;
}
inline int Add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
	return b>a?a-b+mod:a-b;
}
inline void swap(int&a,int&b){
	int c=a;a=b;b=c;
}
inline int pow(int a,int b=mod-2){
	int ans(1);for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans;
}
inline void init(const int&n){
	const int&m=Getlen(n);int*now=buf;w[m]=now;now+=1<<m;
	w[m][0]=1;w[m][1]=pow(3,mod-1>>m+1);for(int i=2;i^1<<m;++i)w[m][i]=1ll*w[m][i-1]*w[m][1]%mod;
	for(int k=m-1;k>=0&&(w[k]=now,now+=1<<k);--k)IMP(1<<k,w[k][i]=w[k+1][i<<1]);
	fac[0]=fac[1]=ifac[0]=ifac[1]=inv[1]=1;for(int i=2;i^1<<m;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i^1<<m;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
}
inline void DFT(int*f,const int&M){
	const int&n=1<<M;
	for(int len=n>>1,d=M-1;d>=0;--d,len>>=1)for(int k=0;k^n;k+=len<<1){
		int*W=w[d],*L=f+(k),*R=f+(k|len),x,y;IMP(len,(x=*L,y=*R)),*L++=Add(x,y),*R++=1ll**W++*Del(x,y)%mod;
	}
}
inline void IDFT(int*f,const int&M){
	const int&n=1<<M;
	for(int len=1,d=0;d^M;++d,len<<=1)for(int k=0;k^n;k+=len<<1){
		int*W=w[d],*L=f+(k),*R=f+(k|len),x,y;IMP(len,(x=*L,y=1ll**W++**R%mod)),*L++=Add(x,y),*R++=Del(x,y);
	}
	const int&k=pow(n);IMP(n,f[i]=1ll*f[i]*k%mod);for(int i=1;(i<<1)<n;++i)swap(f[i],f[n-i]);
}
inline void trans(int*f,const int&n,const bool&typ){
	static int g[M];const int&len=Getlen(n+n-1);
	IMP(n,(f[i]=1ll*f[i]*fac[i]%mod,g[i]=!typ&&i&1?mod-ifac[i]:ifac[i]));for(int i=0;(i<<1)<n;++i)swap(g[i],g[n-i]);
	DFT(f,len);DFT(g,len);IMP(1<<len,g[i]=1ll*f[i]*g[i]%mod),f[i]=0;IDFT(g,len);
	IMP(n,f[i]=1ll*ifac[i]*g[n+i]%mod);IMP(1<<len,g[i]=0);
}
inline void sieve(const int&n){
	idk[1]=1;
	for(int i=2;i<=n;++i){
		if(!pos[i])pri[pos[i]=++top]=i,idk[i]=pow(i,m);
		for(int x,j=1;j<=pos[i]&&(x=i*pri[j])<=n;++j)pos[x]=j,idk[x]=1ll*idk[i]*idk[pri[j]]%mod;
	}
}
signed main(){
	scanf("%d%lld",&n,&k);m=(mod-1-k%(mod-1))%(mod-1);++n;init(n<<1);sieve(n+1);IMP(n,scanf("%d",f+i));
	trans(f,n,true);IMP(n,f[i]=1ll*f[i]*idk[i+1]%mod);trans(f,n,false);IMP(n,printf("%d ",f[i]));
}
posted @ 2022-07-08 10:51  Prean  阅读(30)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};