[atARC133F]Random Transition

定义xn个01变量中1的个数,那么翻转一个01变量对x的影响恰与操作相同

换言之,记P(a,b)为初始有a个1且翻转k次后有b个1的概率,则ansi=j=0nAj109P(j,i)

构造二元生成函数(以操作次数和1的个数为变量),则P(a,b)=k!nk[xkyb]G1aG0na(x,y)

(其中Gp表示单个01变量p的生成函数,即Gp(x,y)=ip(mod 2)xii!+ip(mod 2)xiyi!

将其代入答案,记F=j=0nAjG1jG0nj,则ansi=k!109nk[xk,yi]F(x,y)

构造P(x,y)=(y+1)exQ(x,y)=(y1)ex,进而即G1=P+Q2G0=PQ2

将其代入F,即F=12nj=0nAj(P+Q)j(PQ)nj​,展开后即
F=12nj=0n([xj]i=0nAi(x+1)i(x1)i)PjQnj

P,Q的式子代入PjQnj,即(y+1)j(y1)nje(2jn)x,其k次项系数为(2jn)kk!

再将其代入答案,记wj=(2jn)k[xj]i=0nAi(x+1)i(x1)i,则
ansi=1109nk2n[yi]j=0nwj(y+1)j(y1)nj
关于wjansi的计算是类似的,问题即给定{zi},求多项式f(x)=i=0nzi(x+1)i(x1)ni

x1为整体,即
f(x)=i=0nzi((x1)+2)i(x1)ni=i=0nzij=0i(ij)2j(x1)nj=j=0n2j(i=jnzi(ij))(x1)nj
znj=2ji=jnzi(ij),可以使用多项式乘法计算,进而将x1​展开,也即
f(x)=i=0nzi(x1)i=i=0nzij=0i(1)ij(ij)xj=j=0n(i=jn(1)ijzi(ij))xj
i=jn(1)ijzi(ij)也可以类似地使用多项式乘法计算,时间复杂度为o(nlogn),可以通过

复制代码
 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 @   PYWBKTDA  阅读(225)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-01-27 [loj6498]农民
2021-01-27 [luogu3781]切树游戏
2020-01-27 [loj3247]Non-Decreasing Subsequences
点击右上角即可分享
微信分享提示