【博弈论】取棋子游戏

来源:互联网 发布:js添加class 编辑:程序博客网 时间:2024/06/02 10:04

题目大意:有两堆石子,各为 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;}


原创粉丝点击