[博弈论]洛谷P1290
作者:互联网
https://www.luogu.com.cn/problem/P1290
题意:
给定两个正整数M和N,从其中较大的一个数减去较小的数的正整数倍,先得到0的人获胜
思路:
类Nim游戏,根据判定引理推。
但这是先得到0的人获胜,所以先要找必败局面终局。
当前局面,两个数有一个数是0,那就是必败局面,因为这就对应着,上一个人已经取到0了。
假设某个局面(a,b)是必胜局面,a>b,那它的前驱局面(a+b,a)则是必败局面,因为只能指向必胜局面。
而所有(2a+b,a),(3a+b,a)都是必胜局面,因为他们虽然会指向(a,b)但也指向(a+b,a)这个必败局面,所以他们都是必胜局面。
假设某个局面(a,b)是必败局面,那所有(a+b,a),(2a+b,a)..这些都是必胜局面更不用说了。
看代码。
bool dfs(int a,int b){
if(a < b) swap(a,b);
if(b == 0) return 0;
if(dfs(b,a%b) == 0 || a > 2 * b) return 1;
return 0;
}
int t,a,b;
int main(){
cin>>t;
while(t--){
cin>>a>>b;
bool flag = dfs(a,b);
if(flag) cout<<"Stan wins"<<endl;
else cout<<"Ollie wins"<<endl;
}
return 0;
}
标签:局面,博弈论,洛谷,必败,P1290,dfs,必胜,int,return 来源: https://www.cnblogs.com/dtdbm/p/14944300.html