A - 无聊的游戏

应该是博弈论 但我还没学 这题有点水。
n m (a>b)
1 n是m的倍数 那么这种情况下取的人赢了
2 接下来我们考虑一下走到哪部就稳操胜券了 首先你必须取 m个或者大于m并且是m的倍数,那么我们考虑2m个特殊边界,n>2m 举个例子n=2.5m 我只要取到1.5m 换你取 1.5m > m 你必须要取m 还剩0.5m m>0.5m 那么 我只要取完剩下的0.5m 你就GG 那么谁先面对这种情况 谁就赢了
3 一般情况 我们各取一个m 慢慢推进吧 反正最后不是人为能决定的了。

代码如下:

// 人比较菜 写的有点最多 应该可以省一些 
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;

int main()
{
    int n,m;
    while(cin>>n>>m&&(n!=0||m!=0)){
        int ans=1;
        while(1){
        if(n<m)
            swap(n,m);
        if(n%m==0){
            if(ans%2==1){
               puts("Stan wins");
               break;
            }
            else{
               puts("Ollie wins");
               break;
            }
        }
        if(2*m<n){
               if(ans%2==1){
               puts("Stan wins");
               break;
            }
            else{
               puts("Ollie wins");
               break;
            }
        }
        else if(2*m>n)
               n-=m;
    ans++;
    }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值