题目: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;
}