博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM] poj 1067 取石子游戏(威佐夫博奕)
阅读量:5290 次
发布时间:2019-06-14

本文共 966 字,大约阅读时间需要 3 分钟。

取石子游戏
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 33061   Accepted: 10990

Description

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

Input

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

Output

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

Sample Input

2 18 44 7

Sample Output

010

Source

 

解题思路:

那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数)

      An = [(1 + sqrt(5)) / 2 * n], Bn = [(3 + sqrt(5)) / 2 * n]       bn-an=n

如果a,b为奇异局势,则先取者必败。

 

代码:

 

 

#include 
#include
#include
using namespace std;int main(){ int ak,bk; double x=(1+sqrt(5))/2; while(cin>>ak>>bk) { if(ak>bk) swap(ak,bk); int n=bk-ak; if(ak==(int)(n*x)) cout<<0<

 还有一种方法,O(1)内解决, 不过没怎么看懂。。。

转载于:https://www.cnblogs.com/vivider/p/3697669.html

你可能感兴趣的文章
01.C#数据类型、排序、过滤(一章1.1-1.2)
查看>>
C++(笔)002
查看>>
js css3实现钟表效果
查看>>
Poj2795Exploring PyramidsDp
查看>>
Js实现截图功能
查看>>
display:none和visibility:hidden的区别
查看>>
web标准
查看>>
面向过程,面向对象各自优缺点
查看>>
How.To.Process.Image.Infomation.Of.Rotate.And.Flip.From.Server
查看>>
【HTML5】Web存储
查看>>
js实现拖动div,兼容IE、FireFox,暂不兼容Chrome
查看>>
把Visionpro的控件如何加载到VS中去
查看>>
kruskal重构树学习笔记
查看>>
python基础部分----基本数据类型
查看>>
Java的MVC模式简介
查看>>
预备作业01:我所期望的师生关系
查看>>
第八天学习内容 集合
查看>>
1.3 java8新特性总结
查看>>
outline和border区别
查看>>
菜鸟系列k8s——k8s集群部署(2)
查看>>