luogu2252 取石子游戏

题目描述

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

输入输出格式

输入格式:

输入共一行。

第一行共两个数a, b,表示石子的初始情况。

输出格式:

输出共一行。

第一行为一个数字1、0或-1,如果最后你是胜利者则为1;若失败则为0;若结果无法确定则为-1。

输入输出样例

输入样例#1: 复制
8 4
输出样例#1: 复制
1

说明

[数据范围]

50%的数据,a, b <= 1000

100%的数据,a, b <= 1 000 000 000

威佐夫博弈模型

定义奇异情况为必败态

发现有(0,0),(1,2),(3,5),(4,7),(6,10)可以看出,$a0=b0=0$,$ak$是未在前面出现过的最小自然数,而$bk=ak+k$

$ak=[k(1+√5)/2],bk=ak+k(k=0,1,2,…,n方括号表示取整函数)$

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,m;
 8 int main()
 9 {
10   cin>>n>>m;
11   double t=(1.0+sqrt(5))/2.0;
12   double k=abs(n-m);
13   if (min(n,m)==(int)(t*k)) printf("0");
14   else printf("1");
15 }

 

可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k

posted @ 2018-03-07 14:49  Z-Y-Y-S  阅读(274)  评论(0编辑  收藏  举报