相当于每次每个点会变成自己和与自己相差一个二进制位的数的和
直接FWT 快速幂
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline void write(int x){
if (x>=10) write(x/10);
putchar(x%10+'0');
}
const int N=1<<20;
const int P=1e9+7;
const int INV2=(P+1)>>1;
inline ll Pow(ll a,int b){
ll ret=1;
for (;b;b>>=1,a=a*a%P)
if (b&1)
ret=ret*a%P;
return ret;
}
int n,t;
int a[N],b[N];
inline void FWT(int *a,int n,int r){
for (int i=1;i<n;i<<=1)
for (int j=0;j<n;j+=(i<<1))
for (int k=0;k<i;k++){
int x=a[j+k],y=a[j+k+i];
if (r) a[j+k]=(x+y)%P,a[j+k+i]=(x+P-y)%P;
else a[j+k]=(ll)(x+y)*INV2%P,a[j+k+i]=(ll)(x+P-y)*INV2%P;
}
}
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(t);
for (int i=0;i<(1<<n);i++) read(a[i]);
for (int i=0;i<n;i++) b[1<<i]=1; b[0]=1;
FWT(a,1<<n,1);
FWT(b,1<<n,1);
for (int i=0;i<(1<<n);i++) a[i]=a[i]*Pow(b[i],t)%P;
FWT(a,1<<n,0);
for (int i=0;i<(1<<n);i++)
write(a[i]),putchar(' ');
return 0;
}