QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#825516 | #4283. Power of XOR | YangHHao | ML | 0ms | 0kb | C++17 | 3.4kb | 2024-12-21 19:58:40 | 2024-12-21 19:58:41 |
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();
irep(i,n-1,0) {
assert(piv[i]!=-1);
if(piv[i]!=-1) rm_digit(piv[i]);
}
m=min(m,25);
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;
rep(i,0,n-1){
irep(c,n-1,0){
f[c+1]+=trans(f[c],a[i]);
f[c+1]%=mod;
}
}
int ans=0;
vector<int> pc(1<<m,0);
rep(x,1,(1<<m)-1) pc[x]=pc[x^(x&-x)]+1;
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[pc[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: 0
Memory Limit Exceeded
input:
3 2 1 2 3
output:
12