0pts TLE 求调悬棺
查看原帖
0pts TLE 求调悬棺
246316
yanzihe楼主2025/1/28 23:14
#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;
}

如题,下载数据在本地测试没问题

2025/1/28 23:14
加载中...