[atARC133F]Random Transition
定义$x$为$n$个01变量中1的个数,那么翻转一个01变量对$x$的影响恰与操作相同
换言之,记$P(a,b)$为初始有$a$个1且翻转$k$次后有$b$个1的概率,则$ans_{i}=\sum_{j=0}^{n}\frac{A_{j}}{10^{9}}P(j,i)$
构造二元生成函数(以操作次数和1的个数为变量),则$P(a,b)=\frac{k!}{n^{k}}[x^{k}y^{b}]G_{1}^{a}G_{0}^{n-a}(x,y)$
(其中$G_{p}$表示单个01变量$p$的生成函数,即$G_{p}(x,y)=\sum_{i\equiv p(mod\ 2)}\frac{x^{i}}{i!}+\sum_{i\not\equiv p(mod\ 2)}\frac{x^{i}y}{i!}$)
将其代入答案,记$F=\sum_{j=0}^{n}A_{j}G_{1}^{j}G_{0}^{n-j}$,则$ans_{i}=\frac{k!}{10^{9}n^{k}}[x^{k},y^{i}]F(x,y)$
构造$P(x,y)=(y+1)e^{x}$和$Q(x,y)=(y-1)e^{-x}$,进而即$G_{1}=\frac{P+Q}{2}$且$G_{0}=\frac{P-Q}{2}$
将其代入$F$,即$F=\frac{1}{2^{n}}\sum_{j=0}^{n}A_{j}(P+Q)^{j}(P-Q)^{n-j}$,展开后即
$$
F=\frac{1}{2^{n}}\sum_{j=0}^{n}\left([x^{j}]\sum_{i=0}^{n}A_{i}(x+1)^{i}(x-1)^{i}\right)P^{j}Q^{n-j}
$$
将$P,Q$的式子代入$P^{j}Q^{n-j}$,即$(y+1)^{j}(y-1)^{n-j}e^{(2j-n)x}$,其$k$次项系数为$\frac{(2j-n)^{k}}{k!}$
再将其代入答案,记$w_{j}=(2j-n)^{k}[x^{j}]\sum_{i=0}^{n}A_{i}(x+1)^{i}(x-1)^{i}$,则
$$
ans_{i}=\frac{1}{10^{9}n^{k}2^{n}}[y^{i}]\sum_{j=0}^{n}w_{j}(y+1)^{j}(y-1)^{n-j}
$$
关于$w_{j}$和$ans_{i}$的计算是类似的,问题即给定$\{z_{i}\}$,求多项式$f(x)=\sum_{i=0}^{n}z_{i}(x+1)^{i}(x-1)^{n-i}$
以$x-1$为整体,即
$$
f(x)=\sum_{i=0}^{n}z_{i}((x-1)+2)^{i}(x-1)^{n-i}=\sum_{i=0}^{n}z_{i}\sum_{j=0}^{i}{i\choose j}2^{j}(x-1)^{n-j}=\sum_{j=0}^{n}2^{j}\left(\sum_{i=j}^{n}z_{i}{i\choose j}\right)(x-1)^{n-j}
$$
记$z'_{n-j}=2^{j}\sum_{i=j}^{n}z_{i}{i\choose j}$,可以使用多项式乘法计算,进而将$x-1$展开,也即
$$
f(x)=\sum_{i=0}^{n}z'_{i}(x-1)^{i}=\sum_{i=0}^{n}z'_{i}\sum_{j=0}^{i}(-1)^{i-j}{i\choose j}x^{j}=\sum_{j=0}^{n}\left(\sum_{i=j}^{n}(-1)^{i-j}z'_{i}{i\choose j}\right)x^{j}
$$
$\sum_{i=j}^{n}(-1)^{i-j}z'_{i}{i\choose j}$也可以类似地使用多项式乘法计算,时间复杂度为$o(n\log n)$,可以通过
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N (1<<18) 4 #define mod 998244353 5 #define ll long long 6 int n,k,mi[N],fac[N],inv[N],rev[N],a[N],b[N],c[N],A[N]; 7 int qpow(int n,int m){ 8 int s=n,ans=1; 9 while (m){ 10 if (m&1)ans=(ll)ans*s%mod; 11 s=(ll)s*s%mod,m>>=1; 12 } 13 return ans; 14 } 15 void ntt(int *a,int p=0){ 16 for(int i=0;i<N;i++) 17 if (i<rev[i])swap(a[i],a[rev[i]]); 18 for(int i=2;i<=N;i<<=1){ 19 int s=qpow(3,(mod-1)/i); 20 if (p)s=qpow(s,mod-2); 21 for(int j=0;j<N;j+=i){ 22 for(int k=0,ss=1;k<(i>>1);k++,ss=(ll)ss*s%mod){ 23 int x=a[j+k],y=(ll)ss*a[j+k+(i>>1)]%mod; 24 a[j+k]=(x+y)%mod,a[j+k+(i>>1)]=(x-y+mod)%mod; 25 } 26 } 27 } 28 if (p){ 29 int s=qpow(N,mod-2); 30 for(int i=0;i<N;i++)a[i]=(ll)a[i]*s%mod; 31 } 32 } 33 void mul(){ 34 ntt(a),ntt(b); 35 for(int i=0;i<N;i++)c[i]=(ll)a[i]*b[i]%mod; 36 ntt(c,1); 37 } 38 void calc(){ 39 memset(a,0,sizeof(a)); 40 memset(b,0,sizeof(b)); 41 for(int i=0;i<=n;i++){ 42 a[i]=(ll)A[i]*fac[i]%mod; 43 b[i]=inv[n-i]; 44 } 45 mul(); 46 for(int i=0;i<=n;i++)A[n-i]=(ll)mi[i]*inv[i]%mod*c[n+i]%mod; 47 memset(a,0,sizeof(a)); 48 memset(b,0,sizeof(b)); 49 for(int i=0;i<=n;i++){ 50 a[i]=(ll)A[i]*fac[i]%mod; 51 b[i]=inv[n-i]; 52 if ((n-i)&1)b[i]=mod-b[i]; 53 } 54 mul(); 55 for(int i=0;i<=n;i++)A[i]=(ll)inv[i]*c[n+i]%mod; 56 } 57 int main(){ 58 mi[0]=fac[0]=inv[0]=inv[1]=1; 59 for(int i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)+((i&1)*(N>>1)); 60 for(int i=1;i<N;i++)mi[i]=(mi[i-1]<<1)%mod; 61 for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod; 62 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod; 63 for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod; 64 scanf("%d%d",&n,&k); 65 for(int i=0;i<=n;i++)scanf("%d",&A[i]); 66 calc(); 67 for(int i=0;i<=n;i++)A[i]=(ll)qpow((2*i-n+mod)%mod,k)*A[i]%mod; 68 calc(); 69 int C=qpow((ll)1e9*qpow(n,k)%mod*mi[n]%mod,mod-2); 70 for(int i=0;i<=n;i++)printf("%d ",(ll)C*A[i]%mod); 71 return 0; 72 }