原题链接
①. 题目
②. 思路
- 每一堆可以变成不大于原来那堆的任意大小的两堆
- 即a[i]可以拆分成
(b[i],b[j])
,为了避免重复规定b[i]>=b[j],即:a[i]>=b[i]>=b[j]
- 相当于一个局面拆分成了两个局面,由SG函数理论,多个独立局面的SG值,等于这些局面SG值的异或和。
- 因此需要存储的状态就是
sg(b[i])^sg(b[j])
③. 学习点
博弈论_SG函数
④. 代码实现
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
public class Main {
static int N=110;
static int[] f=new int[110];
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int res=0;
Arrays.fill(f,-1);
for (int i = 0; i <n; i++) {
res^=sg(sc.nextInt());
}
System.out.println(res==0?"No":"Yes");
}
static int sg(int x) {
if(f[x]!=-1) {
return f[x];
}
HashSet set = new HashSet<>();
for (int i = 0; i<x; i++) {
for (int j = 0; j <=i; j++) {
set.add(sg(i)^sg(j));
}
}
for (int i = 0;; i++) {
if(!set.contains(i)) {
return f[x]=i;
}
}
}
}