1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <bits/stdc++.h> using namespace std; const int N=2100010,P=100000007; const int a[6][6]={ 1,1,1,1,1,1, 0,1,0,0,0,1, 0,1,0,0,0,100000006, 0,1,0,1,0,1, 0,1,1,0,1,1, 0,1,100000006,0,1,100000006 }; const int b[6][6]={ 1,1,0,100000006,100000006,0, 0,50000004,50000004,0,0,0, 0,50000003,50000004,0,50000004,50000003, 0,100000006,0,1,0,0, 0,50000003,50000003,0,50000004,50000004, 0,50000004,50000003,0,0,0 }; namespace IO { constexpr int S = 1 << 20; char b1[S], *p1, *p2; char b2[S], *p3 = b2; #define G (p1 == p2 && (p2 = (p1 = b1) + fread(b1, 1, S, stdin)), *p1 ++) #define P (p3 == b2 + S && (p3 = b2, fwrite(b2, S, 1, stdout)), *p3 ++)
int R() { int x = 0, c = G; while (!isdigit(c)) c = G; while (isdigit(c)) x = x * 10 + (c & 15), c = G; return x; }
void W(int x, char c) { static char stk[10]; int top = 0; do stk[top ++] = x % 10 | '0', x /= 10; while (x); while (top --) P = stk[top]; P = c; }
void flush() {fwrite(b2, p3 - b2, 1, stdout), p3 = b2;}
#undef G #undef P } int n,A[N],B[N],lim,t[6]; void FWT(int *A){ for(int i=6;i<=lim;i*=6){ for(int j=0;j<lim;j+=i){ for(int k=0;k<i/6;k++){ for(int l=0;l<6;l++)t[l]=A[j+k+l*i/6]; for(int l=0;l<6;l++){ A[j+k+l*i/6]=0; for(int p=0;p<6;p++) (A[j+k+l*i/6]+=1ll*a[l][p]*t[p]%P)%=P; } } } } } void IFWT(int *A){ for(int i=6;i<=lim;i*=6){ for(int j=0;j<lim;j+=i){ for(int k=0;k<i/6;k++){ for(int l=0;l<6;l++)t[l]=A[j+k+l*i/6]; for(int l=0;l<6;l++){ A[j+k+l*i/6]=0; for(int p=0;p<6;p++) (A[j+k+l*i/6]+=1ll*b[l][p]*t[p]%P)%=P; } } } } } void WZH(){ n=IO::R(); lim=1; for(int i=1;i<=n;i++)lim*=6; for(int i=0;i<lim;i++)A[i]=IO::R(); for(int i=0;i<lim;i++)B[i]=IO::R(); FWT(A);FWT(B); for(int i=0;i<lim;i++)A[i]=1ll*A[i]*B[i]%P; IFWT(A); for(int i=0;i<lim;i++)IO::W(A[i]," \n"[i==lim-1]); } int main(){ int T; T=IO::R(); while(T--)WZH(); IO::flush(); return 0; }
|