HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival
考虑到Bouton定理的证明过程,设n个数的Nim和(异或和)为X,其最高位的1在第k位,那么n个数中一定有个y的第k为也是个1.
将y的数量变为X xor y,那么n的数的Nim和为0,便转为先手必败局面。
所以先手有多少种取法,就看n个数里面有多少个y,满足二进制的第k为是个1。
1 #include <cstdio> 2 3 const int maxh = 20; 4 const int maxn = 100 + 10; 5 int a[maxn]; 6 7 int main() 8 { 9 int n; 10 while(scanf("%d", &n) == 1 && n) 11 { 12 int s = 0; 13 for(int i = 0; i < n; i++) { scanf("%d", &a[i]); s ^= a[i]; } 14 if(!s) { puts("0"); continue; } 15 int h = 0; 16 for(int i = 0; i < maxh; i++) if(s & (1 << i)) h = i; 17 int cnt = 0; 18 for(int i = 0; i < n; i++) if(a[i] & (1 << h)) cnt++; 19 printf("%d\n", cnt); 20 } 21 22 return 0; 23 }