设当前状态为 Fi
于是构造 ,
#include<bits/stdc++.h>
#define N (1 << 20) + 50
using namespace std;
typedef long long ll;
const int Mod = 1000000007, inv2 = (Mod + 1) / 2;
int n, T;
ll a[N], b[N];
ll mul(ll a, ll b){ return a * b % Mod;}
ll add(ll a, ll b){ return (a + b) % Mod;}
void Xor(ll *a, int flag){
for(int i = 1; i < n; i <<= 1)
for(int j = 0; j < n; j += (i<<1))
for(int k = 0; k < i; k++){
ll v = a[k + j];
if(flag == 1){
a[k + j] = add(v, a[k + j + i]);
a[k + j + i] = add(v, Mod - a[k + j + i]);
}
else{
a[k + j] = mul(inv2, add(v, a[k + j + i]));
a[k + j + i] = mul(inv2, add(v, Mod - a[k + j + i]));
}
}
}
int main(){
scanf("%d%d", &n, &T); n = 1 << n;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 1; i < n; i <<= 1) b[i] = 1; b[0] = 1;
Xor(a, 1); Xor(b, 1);
for(;T;T>>=1){
if(T&1){ for(int i = 0; i < n; i++) a[i] = mul(a[i], b[i]);}
for(int i = 0; i < n; i++) b[i] = mul(b[i], b[i]);
} Xor(a, -1);
for(int i = 0; i < n; i++) cout << a[i] << " ";
return 0;
}