题目大意:有两堆石子,各为 N、M 个,甲乙两人轮流取石子,每次可以从任意一堆里取走任意多个石子,也可以从两堆中取走相同数量的石子,但不能不取。取走最后一个石子的人为赢家。给出初始状态,问先手有无必胜策略。
数据范围:
RQNOJ 256:1 <= N、M <= 10000。
POJ 1067:1 <= N、M <= 1,000,000,000。
一开始用Sg函数来解,写了半天,把Sg函数的规律都找到了。。。算出来了。。。不知道怎么用??难道是这种 模型不能用Sg函数。
最后上网看到了那个牛逼的题解。啃了很久才看到。用到了Betty定理,和黄金分割。。这怎么是人能想到的?下午再理解一下再来补充。理解
#include <cstdio>
#include <cmath>
const double phi = (1+sqrt(5))/2;
int main()
{
int a;int b;
scanf("%d%d",&a,&b);
if (a > b)
{
a ^= b;
b ^= a;
a ^= b;
}
if (int((b-a)*phi) == a)
printf("N");
else
printf("Y");
return 0;
}