首先就是一个线性基。然后不能放进去的相当于0,然后枚举前多少位和m相同,那么后一位比m小的方案累加入答案即可。
AC代码如下:
#include<bits/stdc++.h>
#define mod 10086
using namespace std;
int n,m,cnt,bin[35],bs[35],s[35];
bool ins(int x){
int i;
for (i=29; i>=0; i--) if (x&bin[i])
if (!bs[i]){ bs[i]=x; return 1; }else x^=bs[i];
return 0;
}
int ksm(int x,int y){
int t=1; for (; y; y>>=1,x=x*x%mod) if (y&1) t=t*x%mod;
return t;
}
int main(){
scanf("%d",&n);
int i,x;
bin[0]=1; for (i=1; i<=29; i++) bin[i]=bin[i-1]<<1;
for (i=1; i<=n; i++){
scanf("%d",&x); if (!ins(x)) cnt++;
}
s[0]=bs[0]; for (i=1; i<=29; i++) s[i]=s[i-1]+(bs[i]>0);
scanf("%d",&m);
int ans=0;
for (i=29,x=0; i>=0; i--){
if ((m&bin[i])>0 && ((x&bin[i])==0 || bs[i])) ans=ans+ksm(2,cnt+(i?s[i-1]:0));
if ((x^m)&bin[i])
if (bs[i]) x^=bs[i]; else break;
}
printf("%d\n",(ans+1)%mod);
return 0;
}
by lych
2016.10.11