P7848
方便起见,下文用
我们注意到
因此计算
我们先手算一下
注意到除非
也就是说,
我们惊讶地发现把一个东西乘上
每一项都乘上
n ,然后翻转后n-1 项。
也就是说,如果再乘上
那么我们先算出来
时间复杂度为
#include<complex>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define int long long
#define MAXN 2100000
using namespace std;
int x[MAXN],y[MAXN],z[MAXN];
int N,M;
int read(){
int x=0;char c=getchar();
for(;(c<'0'||c>'9');c=getchar());
for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
return x;
}
int rev[MAXN],k,L;
const int mod=998244353;
const int g=3;
const int g1=332748118;
void init(){
rev[0]=0;
for(int i=0;i<k;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
}
int ksm(int x,int y){
x%=mod;int ans=1;
for(int i=y;i;i>>=1,x=x*x%mod)if(i&1)ans=ans*x%mod;
return ans%mod;
}
void ntt(int *a,int sz,int tag){
for(int i=1;i<sz;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
int n=log2(sz);
for(int i=1;i<=n;i++){
int m=1<<i,wn;
if(tag==1)wn=ksm(g,(mod-1)/(m));
else wn=ksm(g1,(mod-1)/(m));
for(int j=0;j<sz;j+=m){
int omega=1;
for(int l=0;l<m/2;l++){
int x=omega*a[j+l+m/2]%mod,y=a[j+l]%mod;
a[j+l]=(y+x)%mod;a[j+l+m/2]=(y-x+mod)%mod;
omega=omega*wn%mod;
}
}
}
}
int K,qwq;
signed main(){
qwq=read(),K=read();
N=(1<<qwq)-1;
for(int i=0;i<=N;i++)x[i]=(read()+mod)%mod;
for(k=1,L=0;k<=N;k<<=1,L++);
int qwq=(int)(K/4)*2;K%=4;
for(int i=0;i<=N;i++)x[i]=x[i]*(ksm((N+1),qwq)%mod)%mod;
init();
for(int i=1;i<=K;i++)ntt(x,k,1);
for(int i=0;i<=N;i++)cout<<x[i]%mod<<" ";
puts("");
return 0;
}