POJ - 2348 Euclid‘s Game(博弈)

本文介绍了一个名为POJ-2348Euclid’sGame的博弈问题。玩家Stanwins和Ollie轮流从两个正整数中减去较大数的倍数,目标是使一个数变为0。当a大于等于2b时,先手Stanwins有必胜策略。通过模拟和判断特定条件,可以确定先手是否必胜。文章提供了C++代码实现来判断游戏的胜负,并演示了如何找到必胜态。
摘要由CSDN通过智能技术生成

POJ - 2348 Euclid’s Game

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

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

a>=2b时,先手者一定可以得到a%b的值,将这个值与b做比较,如果b%(a%b)=0,说明下一个操作的人一定是必胜的,那么自己处于必败态,此时需要做的就是进行a%b+b的操作,将两个数变为a%b+bb,那么下一个人的操作只能是将两个数变为a%bb,先手者再次处于必胜态。总的来说就是当a%b=0或者a>=2b的时候先手必胜,其他情况下进行模拟即可,直到出现必胜态,用flag进行计数,当操作的次数为偶数时stan胜利,为奇数时Ollie胜利

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	long long a,b;
	while(scanf("%lld%lld",&a,&b)!=EOF)
	{
		if(a==0&&b==0) break;
		if(a<b) swap(a,b);
		if(a>=2*b)
		{
			puts("Stan wins");
			continue;
		}	
		int flag=0;
		while(1)
		{
			if(a>=b*2||a%b==0) break;
			flag++;
			a-=b;
			if(a<b) swap(a,b);
		}
		if(flag%2) puts("Ollie wins");
		else puts("Stan wins");
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wa_Automata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值