题目连接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/J
题目大意 游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。用到了威佐夫博奕。(a[k],b[k]) 满足a[k]=b[k]+k 称为奇异局势。 那么我们要如何判断一个局势是否为奇异局势?公式如下:
a[k] = [k(1+√5)/2](a[k]这个方括号为下标运算符,[k(1+√5)/2]这个方括号为取整运算符),b[k] = a[k] + k 。
博弈问题的博客连接 http://blog.csdn.net/luomingjun12315/article/details/45479073
//模板 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { int k=abs(a-b); a=a<b?a:b; int ak; ak=floor(k*(1.0+sqrt(5.0))/2);//公式算出啊a[k]与给出的a[k]比较 printf("%d ",ak!=a);//如果不相等,就不是奇异局势 } return 0; }