Description
Input
Output
Sample Input
2 1 8 4 4 7
Sample Output
0 1 0
威佐夫博弈问题: 知道 必败点:第i个点 xi = i * ((sqrt(5.0) + 1) / 2) ; yi = i * ((sqrt(5.0) + 3) / 2)
要判断所给数是否为必败点,若是则必败(即0) 否则必胜(即1)
先观察前几个必败点(o(n)) (0,0) //看成第零个必败点第一个 :(1,2) //看成第一个必败点(3,5) (4,7) (6,10) (8,13) (9,15) (11,18) (12,20)....发现: 第i个必败点 (m, k) 必有 m < k根据已有规律找必败点:input x, y;if(x > y) change:x,y;for(int k = 0; k <= x; i++) //用循环查找是否匹配有失败点{if(x == (int)(k * ((sqrt(5.0) + 1) / 2)) && y == (int)(k * ((sqrt(5.0) + 3) / 2)))printf("0\n");}if(k == x + 1)printf("1\n");...这样做的话,肯定可以,然而题目要求 a, b 范围 0 - 1,000,000,000就假设(a, b) = (999999999,1000000000)要匹配必败点的话。。。。。TLE等着你所以继续发掘规律:又发现:第i个必败点有: i = y - x这就可以大大简化算法:#include <cstdio> #include <cmath> int main() { int x, y, i, k; while(scanf("%d%d", &x, &y) != EOF) { if(x > y) { int t = x; x = y; y = t; } k = y - x; if(x == (int)(k * ((sqrt(5.0) + 1) / 2)) && y == (int)(k * ((sqrt(5.0) + 3) / 2))) printf("0\n"); else printf("1\n"); } return 0; }