poj1067解题报告(某大牛)
/*
*威佐夫博奕(Wythoff Game): 有两堆各若干个物品,两个人轮流从某一堆或同时从两
*堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.
*(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量,则
*奇异局面(先手必败, P-Position) ak =[k(1+√5)/2], bk= ak + k (k=0,1,2,...,n 方括
*号表示取整函数)
*/
以下是极为简短代码
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数
int Wythoff(int a, int b)
{
if (a > b)swap(a, b);
int k = b - a;
if (a == (int)(k * q))return 0; // 奇异局面, 先手必败, P-Position
return 1;
}
int main ()
{
int a, b;
while (scanf("%d%d", &a, &b) != EOF)
{
printf("%d\n", Wythoff(a, b));
}
}