QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#823076 | #4283. Power of XOR | cwfxlh | WA | 0ms | 23968kb | C++14 | 2.0kb | 2024-12-20 19:02:37 | 2024-12-20 19:02:39 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
#define MOD 1000000007
using namespace std;
int n,k,a[503],xxj[503],apr[503],ans,C[503][503],f[503],f2[45][(1<<21)],ppcnt[(1<<21)],renum[503],idx;
int v1[503],tot;
int fstp(int X,int Y){int ret=1,bse=X%MOD;while(Y){if(Y%2)ret=ret*bse%MOD;bse=bse*bse%MOD;Y/=2;}return ret;}
int lowbit(int X){return (X&(-X));}
int getcnt(int X){
if(X==0)return 0;
if(X%2==1)return getcnt(X/2)+1;
return getcnt(X/2);
}
signed main(){
ios::sync_with_stdio(false);
for(int i=1;i<(1<<21);i++)ppcnt[i]=ppcnt[i-lowbit(i)]+1;
for(int i=0;i<=500;i++)C[i][0]=1;
for(int i=1;i<=500;i++){
for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;
}
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=43;j++){
if((rand()%2)==1)a[i]+=(1ll<<j);
}
}
for(int i=0;i<=50;i++)f[i]=fstp(i,k);
for(int i=1;i<=n;i++){
for(int j=0;j<44;j++){
if((a[i]>>j)&1)apr[j]=1;
}
for(int j=43;j>=0;j--){
if((a[i]>>j)&1){
if(xxj[j]==0){
xxj[j]=a[i];
break;
}
else a[i]^=xxj[j];
}
}
}
for(int i=44;i>=0;i--){
if(xxj[i]==0)continue;
for(int j=i+1;j<=44;j++)if(((xxj[j]>>i)&1)!=0)xxj[j]^=xxj[i];
}
for(int i=0;i<=44;i++)if(xxj[i]!=0)v1[++tot]=xxj[i];
if(tot<=23){
for(int i=0;i<(1<<tot);i++){
int u=0;
for(int j=1;j<=tot;j++)if((i>>(j-1))&1)u^=v1[j];
u=getcnt(u);
ans=(ans+f[u])%MOD;
}
}
else{
for(int i=0;i<=44;i++)if(apr[i]&&xxj[i]==0)renum[i]=++idx;
f2[0][0]=1;
for(int i=0,oo=0;i<=44;i++){
if(xxj[i]==0)continue;
int o=0;
for(int j=0;j<=44;j++){
if(apr[j]&&xxj[j]==0&&((xxj[i]>>j)&1))o^=(1<<(renum[j]-1));
}
for(int u=oo;u>=0;u--){
for(int j=0;j<(1<<idx);j++){
f2[u+1][j^o]=(f2[u+1][j^o]+f2[u][j])%MOD;
}
}
oo++;
}
for(int i=0;i<=44;i++){
for(int j=0;j<(1<<idx);j++)ans=(ans+f[ppcnt[j]+i])%MOD;
}
}
for(int i=1;i<=n;i++)if(a[i]==0)ans=ans*2ll%MOD;
ans%=MOD;
ans+=MOD;
ans%=MOD;
cout<<ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 23968kb
input:
3 2 1 2 3
output:
3684
result:
wrong answer 1st numbers differ - expected: '12', found: '3684'