题意:题目给出了两个正数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");
}
}
}