B - Euclid's Game HDU - 1525(简单博弈)

题目链接:

B - Euclid's Game

 HDU - 1525

题目大意:给你两个数n和m,然后每次较大的数可以减去较小的数的k倍(k>=1),然后问你谁会先到达两个数中有0的情况出现。

具体思路:给你两个数n和m,首先判断整除,如果能整除则说明先手必赢。假设n>m,n可以表示成 n = k * m +b, 当k=1或者0的时候,我们只能顺着进行,不能有另外的骚操作,也就是说当k<=1 的时候,这个时候已经能够判断是必胜态还是比必败态了。但是当k>=2的时候,我们可以控制到达k==1还是k==0的状态,所以这个时候我们是必胜态。对于0<=k<=1的状态,我们一步步判断就好了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 const int maxn = 2e5  + 100;
 5 const int N  = 100;
 6 bool check(int n,int m){
 7 int ans=0;
 8 while(1){
 9 if(n<m)swap(n,m);
10 if( n % m==0 || n >= 2 * m )return ans;
11 n-=m;
12 ans^=1;
13 }
14 return ans;
15 }
16 int main(){
17 int n,m;
18 while(~scanf("%d %d",&n,&m)&&(n+m)){
19 if(!check(n,m))printf("Stan wins\n");
20 else printf("Ollie wins\n");
21 }
22 return 0;
23 }

猜你喜欢

转载自www.cnblogs.com/letlifestop/p/10839289.html