【题目】
题目描述:

样例数据:
【样例 1】
输入
6 10
输出
0
【样例 2】
输入
2 1
8 4
4 7
输出
0
1
0
【分析】
博弈论好题。
以下内容部分摘自这里。
定义 (a,b) 为第一堆石子有 a 个,第二堆石子有 b 个时的状态。
不妨令 a≤b,那么显然:
- 若 (a,b) 是必败态,那么 (k,b),(b,k),(k,a),(a,k) 都是必胜态。
- 对于每个必败态的 a,b 不会在另一个必败态中出现(由 1 可得出)。
- 如果有一个必败态 (a,b),那么 (a±k,b±k) 为必胜态。
我们打表,发现:
任意非 0 自然数 a 一定在一个必败态中出现。且第 i 个必败态的形式为 (ai,ai+i)。
ai 是满足不在以前必败态中的任何一个数出现的最小非 0 自然数(由 2 可得出)。
证明:
对于 (ai,ai+i),假设其为必胜态,那么必然存在一种操作使其转换为必败态。
首先假设我们在 ai 中拿出一些石子,使 ai 减小到 ai′,即转换为 (ai′,ai+i),那么 ai′ 一定在前面的必败态出现过。由于 ai+i 严格单调增,不属于前面任何一项的 b。此时得到的局面为必胜态(由 1 可得出)。所以不能减小 ai。
其次若 ai+i 减小,得到 (ai,bi′),易得到 bi′−ai<i,显然这是一个必胜态(由 3 可得出)。所以不能减小 ai+i。
然后也不可能两项同时减小得到必败态,因为前面的必败态的差都小于 i。
所以用反证法,这个结论是对的。
这个时候,我们就需要一个神奇的东西叫贝蒂定理来完成后面的步骤了。
先摘抄一下贝蒂定理的内容。
设 a,b 是无理数且 a1+b1=1,我们记 A={⌊ka⌋∣k∈N∗},B={⌊kb⌋∣k∈N∗}。
那么 A∩B 为空集且 A∪B 为正整数集合 N∗。
证明的话就自己去百度看吧。
有了这个定理,我们就可以通过构造合适的 A,B 来求出第 i 个必败态。
那我们令 b=a+1,即 A={⌊ka⌋∣k∈N∗},B={⌊ka+k⌋∣k∈N∗},这样的话,B 中第 k 个元素刚好比 A 中第 k 个元素大了 k,就可以满足我们的要求。
这样解出来,发现 a=25+1,刚好也是一个无理数,满足前提。
因此,对于一个状态 (x,y),x≤y,如果 x=⌊25+1⋅(y−x)⌋,那就是必败态,否则是必胜态。
【代码】
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
double temp=(sqrt(5)+1)/2;
while(~scanf("%d%d",&n,&m))
{
if(n>m) swap(n,m);
puts(n==(int)(temp*(m-n))?"0":"1");
}
return 0;
}