HDU1525 Euclid's Game
题意:
给你两个数n、m(假设n>m),问让n-k*m(k要保证n-k*m>=0),如果谁先减出来0的话谁就获得胜利
题解:
当n%m==0的时候先手获胜
当n<2*m的时候,那么只能通过辗转相减来一步一步求结果
当n>2*m的时候,先手获胜。假设这个时候我们已经知道了n%m与m这两个数是先手获胜还是后手获胜,假设是先手获胜,那么我们可以把n变成n%m+m
这个时候后手只能是两个数变成(n%m,m),又因为这是一个必胜态,所以先手就获胜了(如果(n%m,m)是后手获胜,那么先手可以直接使(n,m)变成(n%m,m),又因为这是一个必输态且又轮到后手走,所以先手胜利)
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<math.h> 6 #include<stack> 7 #include<math.h> 8 using namespace std; 9 typedef long long ll; 10 const int maxn=1000000; 11 int main() 12 { 13 int n,m; 14 while(~scanf("%d%d",&n,&m)) 15 { 16 if(n==0 && m==0) break; 17 if(n<m) swap(n,m); 18 int flag=0; 19 while(1) 20 { 21 if(n/m>=2 || n==m) 22 break; 23 n-=m; 24 swap(n,m); //因为剩下来的都是n/m<2的,所以每一次n-=m之后,n就小于m了 25 flag^=1; 26 } 27 if(!flag) printf("Stan wins\n"); 28 else printf("Ollie wins\n"); 29 } 30 return 0; 31 }