hdu 1527 威佐夫博弈

威佐夫博弈的入门题

两堆石子分别有a、b个,每次能从一堆中取走>=1个石子,或者从两队中取走同样多个石子

奇异局势:面对奇异局势时,先手的人必输。

关键在于奇异和非奇异相互转换的证明,

证明过程->传送门

总之最后的证:任意非奇异局势均可通过一步转换到奇异局势。

这样一来,只要判断初始状态的局势就可以了。

先将a置为较小的一个数,令k=[(√5-1)*a/2].

若a=ak并且b=ak+k或者a=ak+1而且b=ak+1+k,则为奇异局势,先手必输。

否则先手必胜。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define sqr(a) (a)*(a)
#define lan(a,b) memset(a,b,sizeof(a))

using namespace std;


int main()
{
    LL a,b;
    while(~scanf("%lld%lld",&a,&b))
    {
        if(a>b)
        {
            LL t=a;
            a=b;
            b=t;
        }
        LL k=(sqrt(5.0)-1.0)*(double)a/2;
        LL l=(1+sqrt(5.0))/2*k;
        LL p=(1+sqrt(5.0))/2*(k+1);
        if(a==l&&b==a+k)
            printf("0\n");
        else if(a==p&&b==a+k+1)
            printf("0\n");
        else
            printf("1\n");
    }
    return 0;
}

你可能感兴趣的:(威佐夫博弈)