#威佐夫博弈#洛谷 2252 [SHOI2002]取石子游戏

题目

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。

游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;

二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。

现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。


分析

若两堆石子个数分别为(n,m(ngeq m))

那么先手必败当且仅当

[lfloorfrac{sqrt{5}+1}{2}(n-m) floor=m ]

表示不会证明,记这个结论就行了


代码

#include <cstdio>
#include <cmath>
#define rr register
using namespace std;
const double o=(sqrt(5)+1)/2;
int a,b;
signed main(){
	scanf("%d%d",&a,&b);
	if (a<b) a^=b,b^=a,a^=b;
	if ((int)((a-b)*o)==b) putchar(48);
	    else putchar(49);
	return 0;
}
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13859253.html