题目类型 :
有两堆物品数量若干,两人轮流从某一堆或同时从两堆中选取同样多的物品,规定每次最小选一个,多者不限,最后一次取尽者获胜。
分析 :
相比于巴什博弈,此种博弈得情形更加复杂些,我们用(X , Y)表示当前得局势,如果甲面对(0 , 0)说明甲输掉了比赛,我们称这种状态是奇异局势,前几个奇异局势是 (0 , 0) , (1 , 2) , (3 , 5) , (4 , 7) , (6 , 10) , (8 , 13) , (9 , 15) , (11 , 18)
可以看出,x是未在前面出现过得最小自然数,并且经过任何操作,都可以将奇异局势变成非奇异局势
现在,如果给你一个局势(x, y),如何判断他是不是奇异局势
x = k * (1 + sqrt(5) )/2 ; y = x + k
对于一个当前的局势如果 (y - x) * ((1 + sqrt(5) )/2 ) = x
代码示例 :
double pp = 1.0*(1.0+sqrt(5.0))/2.0; int main() { int x, y; while(~scanf("%d%d", &x, &y)){ if (x > y) swap(x, y); int k = y - x; if (x == (int)(1.0*k*pp)) printf("0 "); else puts("1"); } return 0; }