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"); }