-
Notifications
You must be signed in to change notification settings - Fork 527
/
Copy pathCode06_WythoffGame.java
64 lines (56 loc) · 2.21 KB
/
Code06_WythoffGame.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package class095;
// 威佐夫博弈(Wythoff Game)
// 有两堆石子,数量任意,可以不同,游戏开始由两个人轮流取石子
// 游戏规定,每次有两种不同的取法
// 1) 在任意的一堆中取走任意多的石子
// 2) 可以在两堆中同时取走相同数量的石子
// 最后把石子全部取完者为胜者
// 现在给出初始的两堆石子的数目,返回先手能不能获胜
// 测试链接 : https://www.luogu.com.cn/problem/P2252
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigDecimal;
public class Code06_WythoffGame {
// 黄金分割比例
// 洛谷在2024年5月增加了测试数据
// 需要更高精度的黄金比例 + 更高精度的乘法,才能全部通过
// 增加的测试用例有刻意为难的嫌疑,其实没啥意思
// Java就用BigDecimal类型支持高精度,C++同学可以用long double类型
public static BigDecimal split = new BigDecimal("1.61803398874989484");
public static int a, b;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
a = (int) in.nval;
in.nextToken();
b = (int) in.nval;
out.println(compute());
out.flush();
}
out.close();
br.close();
}
public static int compute() {
int min = Math.min(a, b);
int max = Math.max(a, b);
// 威佐夫博弈
// 小 != (大 - 小) * 黄金分割比例,先手赢
// 小 == (大 - 小) * 黄金分割比例,后手赢
// 要向下取整
// 这里用BigDecimal类型的multiply方法,乘完后再转成整型,可以支持高精度的乘
if (min != split.multiply(new BigDecimal(max - min)).intValue()) {
return 1;
} else {
return 0;
}
}
}