Euclid‘s Game(博弈)

减去两数差值的Euclid’s Game

题目大意

A和B比赛,玩家必须在棋盘上写上一个正数,该数字等于棋盘上已有的两个数字的差值;
这个数字必须是新的,即与主板上已有的所有数字不同。无法移动的玩家输掉游戏。
A先手

思路

判断较大值除以两数的最大公约数的奇偶性即可

AC Code

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
// #define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
typedef long long ll;
const double PI=acos(-1.0);
const double e=exp(1.0);
const int M=1e9+7;
const int N=2e5+7;
inline int mymax(int x,int y){return x>y?x:y;}
inline int mymin(int x,int y){return x<y?x:y;}
inline int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
void solve(){
    int n, m;
    while(~scanf("%d%d", &n, &m) && n && m){
        if(n<m) swap(n,m);
        if((n/gcd(n,m))&1)  cout<<"Stan wins"<<endl;
        else                cout<<"Ollie wins"<<endl;
    }
	return ;
}

signed main(){
    solve();
    return 0;
}
减去两数倍数的Euclid’s Game
题目传送门

Euclid’s Game

题目大意

Stan wins和Stan wins进行比赛,给定两个数,每次将两个数中较大的那个减去较小的那个数的整数倍,减去后依然为正整数
直到两个数有一个数为0,先到0的胜利。
Stan wins先手

思路

第一次遇见可以选择的人将获胜
即为当 a ≥ 2 ∗ b a≥2*b a2b的时候,可以选择转移到 ( a % b , b ) (a\%b,b) (a%b,b)或者 ( a % b + b , b ) (a\%b+b,b) (a%b+b,b)从而产生不同的局势,而这个人足够聪明所以他可以判断出必胜态
所以我们需要找到面临情况这个的人

AC Code

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
// #define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
typedef long long ll;
const double PI=acos(-1.0);
const double e=exp(1.0);
const int M=1e9+7;
const int N=2e5+7;
inline int mymax(int x,int y){return x>y?x:y;}
inline int mymin(int x,int y){return x<y?x:y;}
inline int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
void solve(){
    int n, m;
    while(~scanf("%d%d", &n, &m) && (n||m)){
        if(n<m) swap(n,m);
        int flag=1;
        while(1){
            if(n%m==0||m==0||n>=2*m) break;
            int t=n;
            n=m;
            m=t-m;
            flag^=1;
        }
        if(flag)    cout<<"Stan wins"<<endl;
        else        cout<<"Ollie wins"<<endl;
    }
	return ;
}

signed main(){
    solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值