http://acm.hdu.edu.cn/showproblem.php?pid=1850
Nim博弈,求保证先手必胜可选的方案数。
对于一个必胜的局面,至少有一个方案可以到达必败局面。也就是说,对于a1^a2..^an!=0一定有一个ai可以改为ai',且a1^a2..^ai'..^an==0。设a1^a2..^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(因为k的最高位为1),那么有ai^k<ai成立。则a1^a2..^an^k=0,可得ai'=ai^k。
题意找有多少种先手必胜的方案,枚举ai,统计满足ai^k<ai的个数即可。
code:
#include<cstdio>
int a[101] ;
int main(){
int n, i, ans, count ;
while(~scanf("%d", &n)&&n){
ans = count = 0 ;
for(i=0; i<n; i++){
scanf("%d", &a[i]) ;
ans ^= a[i] ;
}
if(!ans){
printf("0\n");
continue ;
}
for(i=0; i<n; i++)//枚举ai
if(a[i]>(ans^a[i])) count ++ ;
printf("%d\n", count) ;
}
return 0 ;}
int a[101] ;
int main(){
int n, i, ans, count ;
while(~scanf("%d", &n)&&n){
ans = count = 0 ;
for(i=0; i<n; i++){
scanf("%d", &a[i]) ;
ans ^= a[i] ;
}
if(!ans){
printf("0\n");
continue ;
}
for(i=0; i<n; i++)//枚举ai
if(a[i]>(ans^a[i])) count ++ ;
printf("%d\n", count) ;
}
return 0 ;}