Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6706 Accepted Submission(s): 3646

Problem Description
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

Input
输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。

Output
输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。

Sample Input
2 1
8 4
4 7

Sample Output
0
1
0

【题目链接】:http://acm.hdu.edu.cn/showproblem.php?pid=1527

【题解】

/*假设剩余的石子为(i,j);(不妨设i<=j)有这样的必败点(0,0) (1,2) (3,5) (4,7) (6,10)...设为(n,m)为第x对必败点;(从0开始);这里的n是前面的x-1对必败点中没有出现的最小整数;m则等于n+x这里的n有通项公式n=[x*(1+√5)/2][x]为不超过x的最大整数;①证所有的自然数都有出现在必败点中;n[x]是之前没有出现过的自然数;所以n[x]>n[x-1];又m[x]=n[x]+x>n[x-1]+x-1=m[x-1]>n[x-1]所以m[x]比之前出现过的所有数字都大;即也没有出现过;又n[x]是之前没有出现过的数中最小的那个;则可知所有的自然数都出现在了必败点中;(可能在i也可能在j);②证所有的必败点都能在规则允许的操作内推出必胜点;(i,j)->(i+t,j)||(i,j+t)||(i+t,j+t);显然都是合法的操作;t取任意实数都能推出一个必胜点;(且因为它们两个的差是固定的k,则不可能是下一个必败点);③证所有的不是上述必败点的都是必胜点(能转移到必败点);设非必败点为(i,j)这里i<=j因为所有的自然数都在必败点当中(是必败点对中的一个)则一.若i=n[x],1' j>m[x]则可以让j减少j-m[x]就变成必败点了;2' j<m[x]则可以让(n[x],j)->(n[j-n[x]],n[j-n[x]]+j-n[x])即i和j同时减少n[x]-n[j-n[x]]这里因为j>=i,所以j>=n[x];而变化后的点是一个合法的必败点;二.若j=m[x]1' i>n[x]则让i减少i-n[x],这样(i,j)就变成必败点了;2' i<n[x]这里还有分类i肯定是某个必败点的元素;(自然数都是必败点的元素);①如果i=n[x0](x0<x)则j=m[x]>m[x0];则让j减去j-m[x0]就又得到一个必败点了;->(n[x0],m[x0])②如果i=m[x0](x0<x)j=m[x]>m[x0]>n[x0];则让j减去j-n[x0];这样i会变成大于j的了->(m[x0],n[x0]);但是没关系再倒回了就好;总之又得到了必败点综上不是必败点就一定是必胜点(所以证明②有什么用?:))则对于输入,先保证a<b然后x=b-a看看x*(1+√5)/2是不是等于a;如果是,则为必败点;否则为必胜点;
*/

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)typedef pair<int,int> pii;
typedef pair<LL,LL> pll;//const int MAXN = x;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);int a,b;int main()
{//freopen("F:\\rush.txt","r",stdin);while (~scanf("%d%d",&a,&b)){if (a>b)swap(a,b);int x = b-a;int temp = floor(x*(1.0+sqrt(5))/2.0);if (temp==a)puts("0");elseputs("1");}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626728.html

【hdu 1527】取石子游戏相关推荐

  1. HDU - 1527 取石子游戏(威佐夫博弈)

    题目链接:点击查看 题目大意:有两堆石子,两个人轮流取,每次可以取一堆中任意多的石子,或者取两堆中数量相同的石子,先将石子取完者获胜,若先手获胜输出1,后手获胜输出0 题目分析:这个题目涉及到了威佐夫 ...

  2. hdu 2516 取石子游戏

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. java取石子_HDU 1527 取石子游戏

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. HDU 2516 取石子游戏 斐波纳契博弈

    斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...

  5. HDU 2516 取石子游戏 斐波那契博弈

    传送门 背下来的一个概念题没什么好说的 有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍,当石子数为斐波那契数 ,先手输,反之先手赢 # ...

  6. 取石子游戏(hdu1527+威佐夫博弈)

    S - 取石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Submit ...

  7. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  8. bzoj1874: [BeiJing2009 WinterCamp]取石子游戏

    1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 834  Solved: 350 ...

  9. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

  10. POJ 1067 取石子游戏

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40917   Accepted: 13826 Descripti ...

最新文章

  1. DeepMind新突破!首次用深度学习从第一性原理计算分子能量
  2. Pytorch网络结构可视化
  3. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
  4. php开发支持的文件类型整理
  5. cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
  6. C# :socket 通讯基础使用实例
  7. codeforces1451 C. String Equality
  8. SQL Server 导入bak备份出错
  9. Failed to build Android - icescreem-4.0.4
  10. 数学建模软件lingo的基本使用方法
  11. 2022-06-14 QThread CPU压力测试
  12. 串口连接交换机,进行交互
  13. dnf新起号怎么才不出人脸_教你如何快速养成一个新号 新角色速成教学
  14. 前端快速上手APICloud App开发
  15. 使用kubeadm在CentOS上搭建Kubernetes1.14.3集群
  16. poi操作word常用操作方法,word工具包
  17. 2021年中式烹调师(中级)及中式烹调师(中级)模拟试题
  18. IO_FILE 与高版本 glibc 中的漏洞利用技巧
  19. Arcgis二次开发——建立自己的小工程
  20. Android 控件 之 Adapter

热门文章

  1. Css中Position属性的含义
  2. 万万没想到,一个可执行文件原来包含了这么多信息!
  3. 业务代码中,太多 if else 怎么办?
  4. 短网址有啥好处,用长网址不香吗?
  5. 一组匹配中国大陆手机号码的正则表达式
  6. Java 中的四种引用类型
  7. JAVA多线程:线程创建过程以及生命周期总结
  8. 斗地主程序设计c语言,C语言斗地主游戏v0.1
  9. html基础--列表标签03,03HTML基础--列表标签
  10. jsonutil java_Java实现的JSONUtil工具类与用法示例