Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2403 Accepted Submission(s): 1441

Problem Description

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

Input

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

Output

输出也有若干行,如果最后你是败者,则为0,反之,输出1,并输出使你胜的你第1次取石子后剩下的两堆石子的数量x,y,x<=y。如果在任意的一堆中取走石子能胜同时在两堆中同时取走相同数量的石子也能胜,先输出取走相同数量的石子的情况.

Sample Input

1 2

5 8

4 7

2 2

0 0

Sample Output

0

1

4 7

3 5

0

1

0 0

1 2

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

【题解】

/*
【威佐夫博弈】:http://blog.csdn.net/harlow_cheng/article/details/54097803
输入的a,b满足a<=b;
则先作差
x = b-a;
temp = floor((1.0+sqrt(5.0))/2.0);
if (temp==a)
是必败点,输出no;
else
{
你所走的一步必然要让对方面临必败点;
这里temp=n[x];
if (a>temp)
{(同时减去的话差值x不变,所以如果a不能变成n[x]的话就不能同时取)
可以两堆同时减去a-n[x];
->(n[x],b-a+n[x]);
->(n[x],n[x]+x);
->符合题意的必败点;
输出tmep,b-a+temp;
}
单独取的话;
肯定是减少这两个中的一个;
①如果减少b;
则求a对应的必败态的b是多少->b'(可以预处理得到);
则如果b>b',就输出这个(a,b')就好;
②如果减少a
则求b对应的必败态的a是多少->a'
则如果a>a',就输出这个(a',b)就好;
}
*/

【完整代码】

#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 dic[2000000]; int main()
{
int now = 0,n=0,m;
while (n<=1000000)
{
n = floor(now*(1.0+sqrt(5.0))/2.0);
m = n+now;
dic[n] = m;
dic[m] = n;
now++;
}
while (~scanf("%d%d",&a,&b))
{
if (a==0 && b==0)
break;
int x = b-a;
int temp = floor(x*(1.0+sqrt(5.0))/2.0);
if (a==temp)
puts("0");
else
{
puts("1");
if (a>temp)
printf("%d %d\n",temp,temp+x);
int judge;
//sub b
judge = dic[a];
if (b>judge)
{
printf("%d %d\n",min(a,judge),max(a,judge));
continue;
}
//sub a
judge = dic[b];
if (a>judge)
printf("%d %d\n",min(judge,b),max(judge,b));
}
}
return 0;
}

最新文章

  1. 去除 Google 重定向
  2. python-etcd
  3. [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能
  4. css position, display, float 内联元素、块级元素
  5. js实现鼠标右键自定义菜单(弹出层),并与树形菜单(TreeView)、iframe合用(兼容IE、Firefox、Chrome)
  6. mybatis n+1问题
  7. WPF窗口长时间无人操作鼠标自动隐藏
  8. CoreText学习(一)Base Objects of Core Text
  9. NSInteger到底是什么数据类型
  10. Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeExcep
  11. 【玩转开源】BananaPi R2——移植RPi.GPIO 到 R2
  12. Linux Collection:源和更新
  13. renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)
  14. rxjs简单入门
  15. Nand flash code
  16. CycleGAN 各种变变变
  17. javascript闭包(Module模式)的用途和高级使用方式
  18. (转)教你手工mysql拆库
  19. C++之在类内部访问对象的私有成员
  20. 关于相对布局RelativeLayout的各种属性介绍

热门文章

  1. KNIMI数据挖掘建模与分析系列_002_利用KNIMI做商超零售关联推荐
  2. Google Web Toolkit(GWT) 在windows下环境搭建
  3. adapter-自定义adapter的典型写法
  4. 学习笔记:Vue——插槽
  5. 洛谷 P2368 EXCEEDED WARNING B
  6. ds1302模块的一个arduino程序
  7. FZU Problem 2168 防守阵地 I
  8. ExtJs4学习(七)MVC中的Store
  9. 手把手教你----MyEclipse中 配置 Tomcat
  10. 7、linux系统2440开发板域名解析问题