Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game

题意:

给出n和m两个数,每次可以把较大的那个减少较小的数的整数倍(减完>=0)

两个人轮流进行,最先将一个数减为0的人获胜

问先手必胜还是必败

 

令n<m

若m是n的倍数,那么先手必胜

若m>2*n,那么

若(n,m%n)是必胜态,那么先手将m减至剩下m%n必胜

若(n,m%n)是必败态,那么先手将m减至m%n+n必胜

所以先手必胜

若n<m<2*n,那此时只能进行一次m减n,重复这样的操作,直至到m>=2*n的状态

判断进行了多少次m减n的操作

偶数次先手必胜,奇数次先手必败

 

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    long long n,m;
    cin>>n>>m;
    if(n>m) swap(n,m);
    if(!(m%n)) printf("win");
    else if(m<2*n)
    {
        int t=0; 
        while(m<2*n)
        {
            ++t;
            m-=n;
            if(m<n) swap(n,m);
        }
        if(t&1) printf("lose");
        else printf("win");
    }
    else printf("win");
}

 

posted @ 2020-09-07 19:34  TRTTG  阅读(149)  评论(0编辑  收藏  举报