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
", cnt);
20     }
21 
22     return 0;
23 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4418231.html