HDU 1525 Euclid's Game(博弈)

题意:题目给出了两个正数a, b,每次操作可以把大的数减掉小的数的整数倍。一个数变为0 的时候结束。


谁先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。


思路:假设a>=b, 如果a%b == 0, 那么肯定是先手胜。(点击打开链接)如果a>=2*b.  那么 那个人肯定知道a%b,b是必胜态还是必败

态。如果是必败态,先手将a,b变成a%b,b,那么先手肯定赢。如果是必胜态,先手将a,b变成a%b+b,b.那么对手只有将这两个数变成

a%b,b,先手获胜。如果是b<a<2*b  那么只有一条路:变成a-b,b  (这个时候0<a-b<b).这样一直下去看谁先面对上面的必胜状态。

假如面对b < a <2*b的状态,就先一步一步走下去。直到面对一个a%b==0 || a >=2*b的状态。


代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b;
		while (sc.hasNext()) {
			a = sc.nextInt();
			b = sc.nextInt();
			if (a == 0 && b == 0)
				break;
			if (a < b) {
				int t = a;
				a = b;
				b = t;
			}
			int win = 0;
			while (b != 0) {
				if (a == b || a >= 2 * b)
					break;
				a -= b;
				int t = a;
				a = b;
				b = t;
				win ^= 1;
			}
			System.out.println(win == 0 ? "Stan wins" : "Ollie wins");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值