POJ 1067 取石子游戏 威佐夫博弈

威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

可以看出:a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数),其中(1+√5)/2 为黄金分割数q
 
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0x3f3f3f3f
#define MAX 1005
#define Temp 1000000000
#define MOD 1000000007

using namespace std;

int main()
{
    double q=(1+sqrt(5.0))/2.0;//黄金分割数
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n > m)
            swap(n,m);
        int k=m-n;
        if(n==(int)(k*q))
            printf("0
");
        else
            printf("1
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/alan-W/p/5949185.html