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");
else
puts("1");
}
return 0;
}

【hdu 1527】取石子游戏的更多相关文章

  1. hdu 1527 取石子游戏(Wythoff Game)

    题意:Wythoff Game 思路:Wythoff Game #include<iostream> #include<stdio.h> #include<math.h& ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...

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

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  4. 题解报告:hdu 1527 取石子游戏(威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...

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

    基础威佐夫博弈,判断奇异局势即可,判断方式为k为两数之差绝对值,(sqrt(5) + 1) / 2 * k若等于两数小者则为奇异局势,也就是必败态. #include<stdio.h> # ...

  6. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  7. HDU 2516 取石子游戏(斐波那契博弈)

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

  8. HDU 2516 取石子游戏(FIB博弈)

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

  9. HDU 2516 取石子游戏 (博弈论)

    取石子游戏 Problem Description 1堆石子有n个,两人轮流取.先取者第1次能够取随意多个,但不能所有取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出" ...

  10. 【博弈】【HDU】取石子游戏

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

随机推荐

  1. Android学习笔记之网络接口(Http接口,Apache接口,Android接口)

    目前Android平台有三种网络接口可以使用,他们分别是:Java.NET.*(标准Java接口),org.apache(Apache接口),和android.Net.*(android网络接口). ...

  2. jquery点击完一个按钮,并且触发另一个按钮

    $a.click(function(){ $b.trigger('click'); });

  3. 一个简单http请求的jmeter压测实战流程

    1.新建线程组 2.创建http请求 注意:接口路径中的参数值要写变量 3.创建txt文件,存多个参数值 4.创建csv文件,在csv中上传txt文件 5.variable name填写txt中参数值 ...

  4. Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

    三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...

  5. 原生js大总结十

    91.ajax的优点     a.提高运行效率   b.提高用户体验,让多件事情同时发生   c.在不刷新页面的情况下可以对局部数据进行加载和刷新       92.ajax请求的流程   1.创建通 ...

  6. 洛谷 P2790 ccj与zrz之积木问题

    P2790 ccj与zrz之积木问题 题目背景 ccj和zrz无聊到了玩起了搭积木...(本题选自uva101,翻译来自<算法竞赛入门经典2>) 题目描述 从左到右有n个木块,编号从0到n ...

  7. 洛谷—— P1168 中位数

    https://www.luogu.org/problem/show?pid=1168 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], ...

  8. MySQL參数binlog-do-db对binlogs写入的影响

    1. 环境描写叙述 目的:当数据库中设置了binlog-do-db时.在不同的binlog_format=statement | row | mixed 下对binlog的写入影响,这个在主从复制中会 ...

  9. &lt;九度 OJ&gt;题目1012:畅通project

    题目描写叙述: 某省调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.省政府"畅通project"的目标是使全省不论什么两个城镇间都能够实现交通(但不一定 ...

  10. (嵌入式开发)自己写bootloader之编写第二阶段

    内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M.     ...