B - Euclid's Game HDU - 1525(简单博弈)
题目链接:
B - Euclid's Game
题目大意:给你两个数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 }