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 }
代码君

 

你可能感兴趣的:(spring)