题解(有注释的代码)
2026-02-09 18:29:53
发布于:湖南
4阅读
0回复
0点赞
#include<bits/stdc++.h>
#define LL long long
#define pc __builtin_popcount
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
const int N=77,M=1<<17|5,mod=998244353,I2=(mod+1)>>1;
int n,m,p,q,K,x0,c[M],f[N][M],g[N][M];
int L,F[N],G[N],A[N],B[N];
inline int ksm(int x,int p){int s=1;for(;p;(p&1)&&(s=1ll*s*x%mod),x=1ll*x*x%mod,p>>=1);return s;}
inline void ad(int &x,int y){x+=y;(x>=mod)&&(x-=mod);}
inline void OR(int *a,bool o)
{
for(int k=1;k<m;k<<=1) for(int i=0;i<m;i+=k+k) for(int j=i;j<i+k;j++)
ad(a[j+k],o?a[j]:mod-a[j]);
}
inline void AND(int *a,bool o)
{
for(int k=1;k<m;k<<=1) for(int i=0;i<m;i+=k+k) for(int j=i;j<i+k;j++)
ad(a[j],o?a[j+k]:mod-a[j+k]);
}
inline void trans(int *f)
{
static int a[M],b[M];
for(int i=0;i<m;i++) a[i]=1ll*f[i]*p%mod,b[i]=1ll*f[i]*q%mod;
OR(a,1);AND(b,1);
for(int i=0;i<m;i++) a[i]=(((LL)a[i])<<pc(i))%mod,b[i]=(((LL)b[i])<<(n-pc(i)))%mod;
OR(a,0),AND(b,0);
for(int i=0;i<m;i++) ad(f[i]=a[i],b[i]);
}// trans f=Af
inline void mul(int *a,int *b)
{
static int c[N<<1];
for(int i=0;i<L;i++) for(int j=0;j<L;j++)
c[i+j]=(c[i+j]+1ll*a[i]*b[j])%mod;
for(int i=2*(L-1);i>=L;i--)
{
int x=mod-c[i];c[i]=0;
for(int j=0;j<L;j++) c[i-(L-j)]=(c[i-(L-j)]+1ll*F[j]*x)%mod;
}
for(int i=0;i<L;i++) a[i]=c[i],c[i]=0;
}// 多项式乘法取模
int main()
{
cin.tie(0)->sync_with_stdio(0);cin>>n>>p>>K>>x0;m=1<<n;
for(int i=0;i<m;i++) cin>>c[i];
int I=ksm(m,mod-2);q=1ll*(mod+1-p)*I%mod;p=1ll*p*I%mod;
for(int t=f[0][x0]=1;t<2*(n+1);t++)
{
for(int i=0;i<m;i++) f[t][i]=f[t-1][i],g[t][i]=g[t-1][i];
trans(f[t]),trans(g[t]);
for(int i=0;i<m;i++) g[t][i]=(g[t][i]+1ll*c[i]*f[t][i])%mod;
}//递推前面的项
if(K<2*(n+1)){
for(int i=0;i<m;i++) cout<<g[K][i]<<" ";
return 0;
}
auto ml=[&](int x){
for(int i=0;i<=L;i++) G[i+1]=F[i];L++;
for(int i=0;i<=L;i++) F[i]=(1ll*F[i]*x+G[i])%mod;
};F[0]=1;
for(int i=0,s=1;i<=n;i++,s=1ll*s*I2%mod) ml(mod-s),ml(mod-s);
for(A[0]=B[1]=1;K;(K&1)&&(mul(A,B),1),mul(B,B),K>>=1);
for(int i=0;i<m;i++)
{
int x=0;
for(int j=0;j<L;j++) x=(x+1ll*A[j]*g[j][i])%mod;
cout<<x<<" ";
}//计算贡献
return 0;
}
这里空空如也






有帮助,赞一个