[poj2348]Euclid's Game

根据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 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11254684.html