题目:https://www.luogu.org/problemnew/show/P1290
考虑两个数的位置变化的时候。
赢,除了一开始就整除(别忘了判断这个!),就只会发生在两个数的位置一变化的时候。
自己只要保持每次自己都是变化后的先手就行了。
就是保证对方的情况一定是只能n中最多取1个m,这样对方只能取这个m,取完后n<m,位置变动。
但是自己一开始就只能取一个m的情况也不一定必输,因为下一步对方也许也还是只能取一个m。要while判断一下。
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; ll c,n,m; int main() { scanf("%lld",&c); while(c--) { scanf("%d%d",&n,&m); if(n<m)swap(n,m); if(n>=2*m||n%m==0)printf("Stan wins ");//>=和n%m==0!!! else { bool cnt=1; while(1) { n-=m;swap(n,m); if(n>2*m||n%m==0) { if(cnt)printf("Ollie wins "); else printf("Stan wins "); break; } cnt=!cnt; } } } return 0; }