POJ 2348 Euclid's Game【博弈】

题目链接:

http://poj.org/problem?id=2348

题意:

给定两个数,两个人每次从较大数中减去较小数的倍数,谁先得到0谁获胜,为谁赢?

分析:

令一种可能出现的整数对为 (a,b) ,其中 (b>a) 。有两种情况

  1. ba<a ,只能从 b 中减去一个a,得到状态 (ba,a) ,那么如果 (ba,a) 是必胜态的话, (ab) 就是必败态,反之同理。
  2. ba>a ,可以从 b 中减去至少2个a,假设可以从 b 中最多可以减去x a ,那么从b中减去 (x1) a 后得到状态(a,b(x1)a),此时即为讨论的第一种情况。如果状态 (ab(x1)a) 为必败态的话,那么 (a,b) 就是必胜态,如果状态 (a,b(x1)a) 为必胜态的话,那么 (bxa,a) 肯定是必败态,所以直接减去 x 倍的a,得到必败态,那么 (a,b) 即为必胜态。

代码:

#include<iostream>
using namespace std;
int main (void)
{
    int a, b;
    while(cin>>a>>b && a + b){
       bool res = true;
       if(a > b) swap(a, b);
       while(a != 0){
         if(b % a == 0 || b - a > a) break;
         b -= a;
         res = !res;
         if(a > b) swap(a, b);
       }
       if(res) cout<<"Stan wins"<<endl;
       else cout<<"Ollie wins"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值