[atARC133F]Random Transition
定义为个01变量中1的个数,那么翻转一个01变量对的影响恰与操作相同
换言之,记为初始有个1且翻转次后有个1的概率,则
构造二元生成函数(以操作次数和1的个数为变量),则
(其中表示单个01变量的生成函数,即)
将其代入答案,记,则
构造和,进而即且
将其代入,即,展开后即
将的式子代入,即,其次项系数为
再将其代入答案,记,则
关于和的计算是类似的,问题即给定,求多项式
以为整体,即
记,可以使用多项式乘法计算,进而将展开,也即
也可以类似地使用多项式乘法计算,时间复杂度为,可以通过

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 }
分类:
atcoder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-01-27 [loj6498]农民
2021-01-27 [luogu3781]切树游戏
2020-01-27 [loj3247]Non-Decreasing Subsequences