您的位置:首页 > 其它

威佐夫博弈基础

2016-08-25 19:22 197 查看
题目:poj1067

题意:游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。先手胜输出1,先手负输出0.

解答:有一个神奇的公式。ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数)。在判断是否满足的时候,算出ak与bk的差值。然后再乘(1+√5)/2,取整。看是否等于ak(两数中较小的那一个)。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int t;
if(a > b)
{
t = a;
a = b;
b = t;
}
int d = b - a;
int tmp = floor(d * (1 + sqrt(5.0))/2);
if(tmp == a)
printf("0\n");
else
printf("1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: