rt,下面是第三篇题解。
q读入后,为什么要那样统计答案。
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=0;int res;
while((ch=getc())>'9'||ch<'0')
(ch=='-')&&(flag=true);
for(res=num;(ch=getc())<='9'&&ch>='0';res=res*10+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int mod=10086;
int b[35],st[35],top,n,q,rk;
inline int ksm(int x,int y){
int res=1;
while(y){
if(y&1) (res*=x)%=mod;
(x*=x)%=mod,y>>=1;
}
return res;
}
void insert(int x){
for(int i=30;i>=0;--i)
if(x>>i&1){
if(!b[i]) return (void)(b[i]=x);
x^=b[i];
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
for(int i=1,x;i<=n;++i) insert(x=read());
q=read();
for(int i=0;i<=30;++i)
if(b[i]) st[top++]=i;
for(int i=0;i<top;++i)
if(q>>st[i]&1) rk+=1<<i;
printf("%d\n",(1ll*rk*ksm(2,n-top)+1)%mod);
return 0;
}