博弈论是真的难!?
给你两个数,每次只能从大的那个减去小的数的正整数倍,先得到零的人获胜
分析一下,(假设为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 }
来源:https://www.cnblogs.com/greenofyu/p/12232043.html