hdu 1851 A Simple Game 博弈论

简单博弈问题(巴什博弈-Bash Game)

巴什博弈:只有一堆n个物品,两个人轮流从这对物品中取物,规定每次至少取一个,最多取m个,最后取光着得胜。

很容易想到当n%(m+1)!=0时,先取者必胜,第一次先拿走n%(m+1)个,以后每个回合都保持两人拿走的物品总和为m+1即可。

这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报10个,谁能报到100者胜。

此题可以把每堆石头的取法看作是一个BashGame,这样只需将每组石头按照BashGame的取法判断,然后将n堆石头做异或,

如果异或的结果不为0,则老师获胜,否则Agrael取胜。

代码如下:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 int main(){
13     int t,m,s,c,ans;
14     cin>>t;
15     while(t--){
16         cin>>m;
17         ans=0;
18         for(int i=0;i<m;i++){
19             scanf("%d%d",&s,&c);
20             ans^=s%(c+1);
21         }
22         puts(ans!=0?"No":"Yes");
23     }
24     return 0;
25 }
View Code

原文地址:https://www.cnblogs.com/xin-hua/p/3251449.html