poj2234 2010.3.5
Poj 2234 MatchesGame
【关键字】
数学博弈
【摘要】
有若干堆火柴,两个人轮流去取,每次调一堆取若干支,最后一个去完火柴的人获胜。
【正文】
1、题目描述
Matches Game
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3536 Accepted: 2019
Description
Here is a simple game. In this game, thereare several piles of matches and two players. The two player play in turn. Ineach turn, one can choose a pile and take away arbitrary number of matches fromthe pile (Of course the number of matches, which is taken away, cannot be zeroand cannot be larger than the number of matches in the chosen pile). If after aplayer’s turn, there is no match left, the player is the winner. Suppose thatthe two players are all very clear. Your job is to tell whether the player whoplays first can win the game or not.
Input
The input consists of several lines, and ineach line there is a test case. At the beginning of a line, there is an integerM (1 <= M <=20), which is the number of piles. Then comes M positiveintegers, which are not larger than 10000000. These M integers represent thenumber of matches in each pile.
Output
For each test case, output "Yes"in a single line, if the player who play first will win, otherwise output"No".
SampleInput
2 45 45
3 3 6 9
SampleOutput
No
Yes
Source
POJ Monthly,readchild
2、算法分析
这道题虽然是模拟,但是居然有数学方法可以证出来公式,搜了一下,发现,这类问题分为好多种,很强大。写这道题的解题报告,就是整理一下这些类型,居然只用公式,不用模拟就可以得出结果。
三种经典博弈问题
(一)巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
很容易想到当n%(m+1)<>0时,先取必胜,第一次先拿走n%(m+1),以后每个回合到保持两人拿走的物品总和为m+1即可。
这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。
(二)威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10).可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk=ak+k.
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...,n 方括号表示取整函数)
奇妙的是其中出现了黄金分割数(1+√5)/2 = 1。618...,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。
POJ1067 取石子游戏
(三)尼姆博弈(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
POJ2234 Matches Game
对于任何奇异局势(a,b,c),都有a^b^c=0.非奇异局势(a,b,c)(a<b<c)转换为奇异局势,只需将c变为a^b,即从c中减去c-(a^b)即可。
两种情况:必败情况与必胜情况。
如果现在处于必胜情况,那么如果到我取,我只要取适当的石子,使得剩下的变成必败情况就OK
那么什么是必败情况呢?其实就是所有堆石子数目按位异或位为0的时候。
显然,当你取完所有的石子后,剩下的是0,异或本身位0;
当只剩下一堆(不为0)的时候,异或不为0,只要取光就为0;
当剩下2堆的时候,除非两堆石子相等,否则异或不为0;那么只要取到两堆相等,把必败情况留给对手。
如此逆向推上。如果你处于必胜情况,也就是异或不为0时,只要取适当的石子,把异或变成0,也就是把必败情况留给对手,那么就赢定了。
3、源码
#include<stdio.h>
int main()
{
int i,m,a[20];
while(scanf("%d",&m)!=EOF)
{
for(i=0;i<m;i++)
scanf("%d",&a[i]);
for(i=1;i<m;i++)
a[i]=a[i]^a[i-1];
if(a[m-1]) printf("Yes\n");
else printf("No\n");
}
return 0;
}