QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#825507#4283. Power of XORYangHHaoWA 0ms3736kbC++173.4kb2024-12-21 19:53:192024-12-21 19:53:20

Judging History

你现在查看的是最新测评结果

  • [2024-12-21 19:53:20]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3736kb
  • [2024-12-21 19:53:19]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
/*
 * Author: Yang
 * Date: 2024-12-03
 */
//#pragma GCC optimize(2)
using ll=long long;
using uint=unsigned int;
using ull=unsigned ll;
using pii=pair<int,int>;
#define all(v) begin(v),end(v)
#define fst first
#define scd second
#define rep(i,s,t) for(int i=(s);i<=(t);++i)
#define irep(i,t,s) for(int i=(t);i>=(s);--i)
template<typename T>
bool chmax(T &x,T y){return x<y?(x=y,1):0;}
template<typename T>
bool chmin(T &x,T y){return y<x?(x=y,1):0;}
constexpr int mod=1e9+7,Mmx=44;
int qp(int a,ll b,int p=mod){
    int r=1;
    while(b){
        if(b&1) r=1ll*r*a%p;
        a=1ll*a*a%p;b>>=1;
    }
    return r;
};
int pwk[Mmx+1];
int solve_2_to_n(vector<ll> a, int k){
    constexpr int m=Mmx;
    array<int,2> n;
    n[0]=a.size()/2;
    n[1]=a.size()-a.size()/2;
    vector<ll> S[2];
    rep(t,0,1){
        S[t].resize(1<<n[t],0);
        rep(x,1,(1<<n[t])-1){
            S[t][x]=S[t][x^(x&-x)]^a[__lg(x&-x)+t*n[0]];
        }
    }
    vector<int> pc(1<<(m/2),0);
    rep(x,1,(1<<(m/2))-1){
        pc[x]=pc[x^(x&-x)]+1;
    }
    int ans=0;
    rep(x,0,(1<<n[0])-1){
        rep(y,0,(1<<n[1])-1){
            ll v=S[0][x]^S[1][y];
            int c=pc[v>>(m/2)]+pc[v&((1ll<<(m/2))-1)];
            (ans+=pwk[c])%=mod;
        }
    }
    return ans;
}
template<int m0=Mmx>
int solve(vector<ll> a,vector<int> piv,int k){
    int m=m0;
    auto rm_digit=[&](int i){
        m--;
        ll const msk=(1ll<<i)-1;
        for(auto &x:a){
            x=(x&msk)|(x>>1)&~msk;
        }
    };
    int n=a.size();
    rep(i,0,piv.back()) rm_digit(0);
    auto trans=[&](valarray<int> const &v, ll x)->valarray<int> {
        valarray<int> r(0,1<<m);
        rep(i,0,(1<<m)-1) r[i^x]=v[i];
        return r;
    };
    valarray<valarray<int>> f(valarray<int>(0,1<<m),n+1);
    f[0][0]=1;
    // cout<<m<<'\n';
    rep(i,0,n-1){
        // cout<<i<<' '<<a[i]<<','<<piv[i]<<'\n';
        irep(c,n-1,0){
            // cout<<' '<<c<<"->"<<c+dc<<'\n';
            f[c+1]+=trans(f[c],a[i]);
            f[c+1]%=mod;
        }
    }
    int ans=0;
    rep(c,0,n){
        rep(x,0,(1<<m)-1){
            // if(f[c][x]) cout<<c<<' '<<x<<" "<<f[c][x]<<' '<<pwk[__builtin_popcount(x)+c]<<'\n';
            (ans+=1ll*f[c][x]*pwk[__builtin_popcount(x)+c]%mod)%=mod;
        }
    }
    return ans;
}
signed main(){
    //ios::sync_with_stdio(false);
    int n,k;
    cin>>n>>k;
    rep(i,1,Mmx) pwk[i]=qp(i,k);
    vector<ll> a(n);
    for(auto &x:a) cin>>x;
    vector<int> piv(n);
    int p=0;
    rep(i,0,n-1){
        while(p<Mmx && none_of(i+all(a),[&](ll x){return x>>p&1;})) p++;
        
        if(p<Mmx) {
            piv[i]=p;
            if(!(a[i]>>p&1)){
                rep(j,i+1,n-1){
                    if(a[j]>>p&1){
                        a[i]^=a[j];
                        break;
                    }
                }
            }
            rep(j,i+1,n-1){
                if(a[j]>>p&1) a[j]^=a[i];
            }
        }
        else piv[i]=-1;
    }
    vector<ll> aa;
    vector<int> pivv;
    rep(i,0,n-1){
        if(piv[i]!=-1){
            aa.push_back(a[i]);
            pivv.push_back(piv[i]);
        }
    }
    int ans=qp(2,n-aa.size());
    cout<<1ll*ans*(aa.size()<=0?solve_2_to_n(aa,k):solve(aa,pivv,k))%mod<<"\n";
    
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3580kb

input:

3 2
1 2 3

output:

12

result:

ok 1 number(s): "12"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3580kb

input:

2 1000000000
1 2

output:

140625003

result:

ok 1 number(s): "140625003"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 3736kb

input:

3 4
21 31 15

output:

132

result:

wrong answer 1st numbers differ - expected: '1076', found: '132'