/*
*威佐夫博奕(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));
}
}
#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));
}
}