根据SG函数定义,可以发现当y<x<2y时,SG(x,y)=[SG(x-y,y)=0],即两者一定存在一个0,因此就有SG(x+ky,y)=mex(0,……)>0。
换句话来说,对于一个状态SG(x,y)(x>y),如果$x\ge 2y$即为必胜状态,而当x<2y时直接继续判断SG(x-y,y)这个状态即可。总时间复杂度类似于求gcd,即$o(log_{2}n)$。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a,b; 5 int main(){ 6 while (scanf("%d%d",&a,&b)!=EOF){ 7 if (a<b)swap(a,b); 8 if (!a)return 0; 9 int ans=0; 10 while (b){ 11 if ((a-b>b)||(a%b==0))break; 12 a-=b; 13 swap(a,b); 14 ans^=1; 15 } 16 if (ans)printf("Ollie wins\n"); 17 else printf("Stan wins\n"); 18 } 19 }