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 }

代码君

时间: 2024-10-18 04:22:18

HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival的相关文章

HDU 1907 Nim博弈变形

1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形.设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败).S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜).T0:a1

hdu 1907(Nim博弈)

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4407    Accepted Submission(s): 2520 Problem Description Little John is playing very funny game with his younger brother. There is one big bo

hdu 1730 Nim博弈

Tom和Jerry正在玩一种Northcott游戏,可是Tom老是输,因此他怀疑这个游戏是不是有某种必胜策略,郁闷的Tom现在向你求救了,你能帮帮他么? 游戏规则是这样的:  如图所示,游戏在一个n行m列(1 ≤ n ≤ 1000且2 ≤ m ≤ 100)的棋盘上进行,每行有一个黑子(黑方)和一个白子(白方).执黑的一方先行,每次玩家可以移动己方的任何一枚棋子到同一行的任何一个空格上,当然这过程中不许越过该行的敌方棋子.双方轮流移动,直到某一方无法行动为止,移动最后一步的玩家获胜.Tom总是先下

hdu 5011 (nim博弈模版)

//nim博弈 //有n堆石头,两人轮流每次从一堆中拿至少1,之多全部的石头,没有石头可拿为lose //判断先手是win还是lose # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i; __int64 a,sum; while(~scanf("%d",&n)) { sum=0; fo

poj 2975 Nim 尼姆博弈,求取胜方案数

Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5002   Accepted: 2313 Description Nim is a 2-player game featuring several piles of stones. Players alternate turns, and on his/her turn, a player's move consists of removing one or mor

HDU 2176 (Nim博弈 先手取胜方案) 取(m堆)石子游戏

切切水题,放松心情:-D 1 #include <cstdio> 2 3 const int maxn = 200000 + 10; 4 int a[maxn]; 5 6 int main() 7 { 8 //freopen("in.txt", "r", stdin); 9 10 int m; 11 while(scanf("%d", &m) == 1 && m) 12 { 13 int s = 0; 14 f

hdu 1536 NIM博弈 (模板)

推荐文章 博弈论初步:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561002.html 博弈解决思想:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561005.html NIM游戏:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561008.html 关于SG函数:http://www.cnblogs.com/Knuth/archive

HDU 3032 (Nim博弈变形) Nim or not Nim?

博弈的题目,打表找规律还是相当有用的一个技巧. 这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆. 这个SG函数值是多少并不明显,还是用记忆花搜索的方式打个表,规律就相当显然了. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 100; 5 int sg[maxn * 2]; 6 bool vis[maxn * 2]; 7 8 int mex(int v) 9 { 10 if(

HDU 2509 Nim博弈

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2509 题意:有N堆,谁最后拿谁输. 关键:判断孤单堆. 1 #include<cstdio> 2 #define ll long long 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 while( ~scanf("%d",&n)){ 9 int temp,ans=0,flag=0; 10 for(int i=