P1290 欧几里得的游戏(博弈论)

博弈论是真的难!?

给你两个数,每次只能从大的那个减去小的数的正整数倍,先得到零的人获胜

分析一下,(假设为x,y,且x>y),x=ky+z,若k>=2,那么我(是不是就可以为所欲为了)想一下减完或者,留一个给对手减是不是都行,然后我再往后分析下,我不就必胜了么?

所以遇到了这种情况或者我可以直接赢的情况(x%y==0)直接输出就好了,否则再找这种情况不就得了(除了这两种情况,我只能规规矩矩的减,正整数倍)

 1 #include<iostream>
 2 using namespace std;
 3 
 4 bool fun(int &a,int &b)//返回1就出现了赢家
 5 {
 6     int t1=max(a,b);
 7     int t2=min(a,b);
 8     a=t2;
 9     b=t1%t2;
10     if(t1%t2)//表示非整除
11     {
12         if(t1/t2>=2)//不能整除但是系数大于0也结束
13             return 1;
14         else//继续
15             return 0;
16     }
17     else
18     {
19         return 1;//能整除就结束
20     }
21 }
22 int main(void)
23 {
24     int c;
25     cin>>c;
26     while(c--)
27     {
28         int a,b;
29         cin>>a>>b;
30         bool flag=1;//1表示stan嬴
31         while(!fun(a,b))
32         {
33             flag=!flag;
34         }
35         if(flag==1)
36             cout<<"Stan wins"<<endl;
37         else
38             cout<<"Ollie wins"<<endl;
39     }
40     return 0;
41 }

猜你喜欢

转载自www.cnblogs.com/greenofyu/p/12232043.html