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

 

posted @ 2019-08-13 11:07  kongbursi  阅读(101)  评论(0编辑  收藏  举报