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]));
}