石子问题解题报告

转载 2012年03月26日 20:20:51

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
/*//下面的内容来自chengmingvictor
先找规律,算几个很小的必败状态
1,2
3,5
4,7
6,10
8,13
...
发现所有的数恰在序列中出现一次
而且差为1,2,3,4,5,...
所以这两个序列构成正整数集的一个分划,猜想可以由betty定理生成(仅仅是猜想,不需要
太多的理由^_^)
其实,这两个序列恰好对应betty定理中alpha=(1+sqrt(5))/2,beta=(3+sqrt(5))/2的情况,
所以问题解决。
这题不算出公式的话是没法做的,因为规模太大,必败状态太多,没有任何的办法
betty定理是说,如果无理数alpha和beta满足
1.alpha,beta>0
2.1/alpha+1/beta=1
那么,序列{[alpha*n]}和{[beta*n]}构成自然数集的一个分划,其中[]是取整函数
这道题对应的alpha和beta分别是(1+sqrt(5))/2,(3+sqrt(5))/2
所以alpha=1/黄金分割
beta/alpha=黄金分割
可以说跟黄金分割有关,但也只是一种巧合吧,黄金分割还是经常出现的*/
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double alpha = (1.0 + sqrt(5.0)) / 2.0;
double beta = (3.0 + sqrt(5.0)) / 2.0;
int big, small, n, temp1, temp2;
while(cin>>big>>small)
{
  if(big < small)
      swap(big, small);  //big 代表两数中较大的一个。
   n = ceil(big / beta);   //返回大于或者等于指定表达式的最小整数 头文件:math.h 
   temp1 = alpha * n;
   temp2 = beta * n;
   if(small == temp1 && big == temp2)
       cout<<0<<endl;
   else 
	   cout<<1<<endl; 
}
return 0;
}

算法_动态规划_石子合并问题

问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n...
  • huangxiang360729
  • huangxiang360729
  • 2016年04月11日 19:26
  • 1939

南邮 OJ 1225 石子合并问题

石子合并问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 151            测试通过 ...
  • changshu1
  • changshu1
  • 2015年08月05日 11:22
  • 504

石子合并问题3种题型

石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将...
  • briup_acmer
  • briup_acmer
  • 2015年01月14日 10:50
  • 723

Hrbust 1818 石子合并问题--直线版【区间dp】

石子合并问题--直线版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 66(34...
  • mengxiang000000
  • mengxiang000000
  • 2016年08月10日 13:33
  • 572

校OJ 8597 石子划分问题(dp)

解题思路: 1,先将石子重量从小到大排序(从大到小也可以). 2,假设f(n,m)表示:n个石头分成m份的最小费用. 特别的,有f(1,1)=0; f(n,1)=(an - a1)^2 那么,除...
  • Lin_disguiser
  • Lin_disguiser
  • 2015年12月28日 11:26
  • 517

石子合并问题--动态规划;贪心

石子合并问题石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆...
  • gatieme
  • gatieme
  • 2015年10月17日 20:18
  • 5805

两人取石子游戏 组合数学-博弈问题

问题源于:编程之美。微策略笔试题。 微策略笔试题:桌子上有数值为Number的数字,2个玩家,每个玩家可以选择减去有 Number中连续1,2,,,,位构成的数值,桌子上换...
  • luckyjoy521
  • luckyjoy521
  • 2013年11月22日 19:50
  • 7826

NYOJ 23取石子问题(巴什博弈)

取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当...
  • huihui1094667985
  • huihui1094667985
  • 2016年07月23日 10:19
  • 559

区间DP入门之 石子归并问题

题目描述:有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最...
  • wuxuanyi27
  • wuxuanyi27
  • 2016年04月21日 21:40
  • 1029

石子合并——圆形版

石子合并——圆形版 一个较为常规的dp,用上了环的处理。
  • G_congratulation
  • G_congratulation
  • 2016年07月08日 20:26
  • 822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:石子问题解题报告
举报原因:
原因补充:

(最多只允许输入30个字)