题意:玩儿游戏,可以把一个数x变成xi,xi&x == x,问先手能不能赢
题解:这个转换,也就说把x变成二进制后,只能在原来有1的位置上写1,并且,至少有一位不写1
很容易想到,一个数的sg值,只跟这个数的二进制有多少个1有关,转换也很好想,但时间肯定来不及
其实只要把所有(<64)的sg值打表出来即可
以前也想到过这种打表,当时数据很大,好像有1e5,被队友狠狠嘲笑了一番
下面是打表,真的是纯暴力,本地都跑了好久
int sg[110];
int vis[30000010];
void init(){
memset(sg,0,sizeof(sg));
for(int i=1;i<=64;i++){
for(int j1=1;j1<i;j1++){
for(int j2=j1;j2<i;j2++){
for(int j3=j2;j3<i;j3++){
for(int j4=j3;j4<i;j4++){
for(int j5=j4;j5<i;j5++){
for(int j6=j5;j6<i;j6++){
for(int j7=j6;j7<i;j7++){
int temp=sg[j1]^sg[j2]^sg[j3]^sg[j4]^sg[j5]^sg[j6]^sg[j7];
vis[temp]=i;
}
}
}
}
}
}
}
for(int j=0;;j++){
if(vis[j]!=i){
sg[i]=j;
break;
}
}
cout<<i<<' '<<sg[i]<<endl;
}
}
int main(){
init();
return 0;
}
剩下的就是直接异或sg[1的个数]就可以了
int sg[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 255, 256, 512,
1024, 2048, 3855, 4096, 8192, 13107, 16384, 21845,
27306, 32768, 38506, 65536, 71576, 92115, 101470,
131072, 138406, 172589, 240014, 262144, 272069,
380556, 524288, 536169, 679601, 847140, 1048576,
1072054, 1258879, 1397519, 2005450, 2097152, 2121415,
2496892, 2738813, 3993667, 4194304, 4241896, 4617503,
5821704, 7559873, 8388608, 8439273, 8861366, 11119275,
11973252, 13280789, 16777216, 16844349, 17102035,
19984054, 21979742, 23734709};
int main(){
int n;
LL x;
while(cin>>n){
int ans=0;
while(n--){
scanf("%lld",&x);
int sum=0;
while(x){
if(x&1)
sum++;
x/=2;
}
ans^=sg[sum];
}
if(ans) printf("B\n");
else printf("L\n");
}
return 0;
}