[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 } 
View Code

 

posted @ 2022-01-27 14:11  PYWBKTDA  阅读(214)  评论(2编辑  收藏  举报