洛谷 - P1290 欧几里德的游戏 (博弈论)

题目传送
在这里插入图片描述
在这里插入图片描述
思路:
假设n < m

1.如果当前m为n的整数倍,那么这个人肯定赢了

2.如果现在m / n >= 2 的话。
有方程 m = k*n + z (k为m/n,z为余数),那么现在这个人就可以拿到(n,z)或者(n,n+z)这俩种情况,因为当m / n == 1的时候,拿到的人不能有任何操作,只能拿成(m-n,n),所以接下来谁赢就只能看递归的次数了,然而我要是都能拿到上述俩种情况,那么自己最后拿到的最终递归结果是能被自己控制的。
综上:如果谁先拿到m/n >= 2,直接赢

3.如果现在m / n == 1,那么没有办法,没有什么策略,只能硬着一个一个拿,生死由天

AC代码

#include <bits/stdc++.h>
inline long long read(){char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 2e5 + 5;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const int mod = 1e9+7;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int solve(int n,int m,int ans)
{
    if(n == 0 || m == 0 || m % n == 0 || m / n >= 2) return ans;
    int a = m-n,b = n;
    if(a > b) swap(a,b);
    solve(a,b,ans+1);
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    //    freopen("input.txt","r",stdin);
    //    freopen("output.txt","w",stdout);
    int t;
    cin >> t;
    while(t--)
    {
        int n,m;
        cin >> n >> m;
        if(n > m) swap(n,m);
        int ans = solve(n,m,1);
        if(ans % 2 != 0) cout << "Stan wins" << endl;
        else cout << "Ollie wins" << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/moasad/article/details/107518132