POJ 1067(威佐夫博奕)
来源:互联网 发布:手机移动网络劫持 编辑:程序博客网 时间:2024/05/21 19:28
Description
Input
Output
Sample Input
2 18 44 7
Sample Output
010
思路:由于之前不了解威佐夫博奕,看到这题后,我就试着推必胜点,首先我就把取石子这个过程看作是在棋盘上走,取第一堆(数目n)的石子就在x轴上走,取第二堆(数目m) 的石子就在y轴上走。所以我们就可以知道x=n,y=m,x=y这三条仙上的点是必胜点(除了x==n&&y==m点 ),然后那么点(n-2,m-1)和(n-1,m-2)点就是必败点,然后又把这些点看成终点,按照之前的思路继续求。 按着这个思路就可以找到(n-1,m-2)(n-2,m-1) (n-3,m-5) (n-4,m-7) (n-5,m-3) (n-6,m-10) (n-7,m-4) (n-8,m-13).......
把n和m去掉就是点 并且使得下x>y 就可以得到一些坐标(0,0)(1,2) (3,5) (4,7) (6,10) (8,13)
到了这个时候我就试着去找规律了
然后就发现了 ak=mes,bk=ak+k // mes表示的是前面没有坐标中没有出现的最小的自然数
最开始(0,0)的是必败点
然后 根据公式
k=1时 a1=1 b1=a1+k=2
k=2 a2=3 b2=a2+2=5
k=3 a3=4 b3=a3+3=7
k=4 a4=6 b4=a4+4=10
...............
然而到这里了我还是不会把这个规律用式子表示出来,僵持之下 只有去找题解了。
然后很神奇的发现原来这就是威佐夫博奕,
机智的威佐夫博奕居然把这个式子给弄出来了, ak=(k*(sqrt(5)+1)/2) bk=ak+k
神奇,居然涉及到黄金分割线
代码
#include<stdio.h>#include<math.h>int main() {int n, m;while(scanf("%d%d",&n,&m)!=EOF){if(n>m){n^=m;m^=n;n^=m;}double k=m-n;int t=(k*(sqrt(5.0)+1)/2);if(t==n) printf("0\n");else printf("1\n");} }
- POJ 1067(威佐夫博奕)
- poj 1067取石子(威佐夫博奕)
- POJ-1067 取石子游戏(威佐夫博奕)
- POJ - 1067 - 取石子游戏 (威佐夫博奕)
- 【威佐夫博奕】POJ 1067
- poj 1067 威佐夫博奕
- poj 1067 威佐夫博奕
- POJ 1067 威佐夫博奕
- POJ-1067 威佐夫博奕
- POJ 1067(广搜水题)
- 威佐夫博奕 || HDU 1257 || POJ 1067
- poj-1067 威佐夫博奕 Wythoff Game
- POJ 1067 取石子威佐夫博奕
- Poj 1067 取石子游戏(NIM,威佐夫博奕)
- [ACM] poj 1067 取石子游戏(威佐夫博奕)
- HDU 1527 、POJ 1067 取石子游戏(威佐夫博奕)
- POJ 1067 HDU 1527 取石子游戏(威佐夫博奕)
- poj 1067
- 事件类型
- 推荐算法介绍
- Windows打开磁盘管理的命令
- RasDialDlg
- 加载光照贴图
- POJ 1067(威佐夫博奕)
- Android控制程序界面的三种方式
- 欢迎使用CSDN-markdown编辑器
- 网络管理之论路由器和交换机的本质区别
- 飞扬的小鸟
- Android自动化压力测试图解教程——Monkey工具
- 批处理命令行开启WiFi热点
- 远程访问MySQL
- 代理模式三(cglib动态代理)