码迷,mamicode.com
首页 > 编程语言 > 详细

HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival

时间:2015-04-11 20:37:06      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

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

 

HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival

标签:

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4418231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!