#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define rrep(i,a,b) for(ll i=(a);i>=(b);i--)
#define MOD 998244353
#define mod(a) if(a>=MOD)a-=MOD;if(a<0)a+=MOD;
const ll N=(1<<17)+9;
ll n;
ll a[N], b[N], aor[N], bor[N], axor[N], bxor[N];
ll turnOR(ll a[], ll ty){//ai->sum(aj)(i|j==i)
//ty=1代表正向变换,ty=-1代表逆向变换
rep(len, 1, (1LL<<(n-1))){
for(ll l=0;l<(1LL<<n)-1;l+=len*2){
rep(k, l, l+len-1){
// cout << aor[0] << endl;
a[k+len]+=a[k]*ty;
mod(a[k+len]);
}
}
}
}
ll turnXOR(ll a[], ll ty){//积化和差
//ty=1代表正向变换,ty=-1代表逆向变换
rep(len, 1, (1LL<<(n-1))){
for(ll l=0;l<(1LL<<n)-1;l+=len*2){
rep(k, l, l+len-1){
ll x=a[k], y=a[k+len];
a[k]=x+y;a[k+len]=x-y;
mod(a[k]);mod(a[k+len]);
if(ty==-1){(a[k]*=499122177)%=MOD;(a[k+len]*=499122177)%=MOD;}
}
}
}
}
void solveOR(ll aor[], ll bor[]){
turnOR(aor, 1);
turnOR(bor, 1);
rep(i,0,(1LL<<n)-1)(aor[i]*=bor[i])%=MOD;
// rep(i,0,(1LL<<n)-1)cout << aor[i] << " "; cout << endl;
turnOR(aor, -1);
// cout << aor[0] << endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n;
rep(i,0,(1LL<<n)-1){cin >> a[i];aor[i]=a[i];axor[i]=a[i];}
rep(i,0,(1LL<<n)-1){cin >> b[i];bor[i]=b[i];bxor[i]=b[i];}
solveOR(aor, bor);
// return 0;
rep(i,0,(1LL<<n)-1)cout << aor[i] << " ";
cout << endl;
// return 0;
rep(i,0,(1LL<<n)-1){aor[i]=a[i];}
rep(i,0,(1LL<<n)-1){bor[i]=b[i];}
rep(i,0,(1LL<<n)-1){
if(i&1){swap(aor[i], aor[((1LL<<n)-1)^i]);swap(bor[i], bor[((1LL<<n)-1)^i]);}
}
solveOR(aor, bor);
rep(i,0,(1LL<<n)-1){
if(i&1){swap(aor[i], aor[((1LL<<n)-1)^i]);swap(bor[i], bor[((1LL<<n)-1)^i]);}
}
rep(i,0,(1LL<<n)-1)cout << aor[i] << " ";
cout << endl;
turnXOR(axor, 1);
turnXOR(bxor, 1);
rep(i,0,(1LL<<n)-1)(axor[i]*=bxor[i])%=MOD;
turnXOR(axor, -1);
rep(i,0,(1LL<<n)-1)cout << axor[i] << " ";
cout << endl;
return 0;
}
如题,下载数据在本地测试没问题