解题思路
主要就是一个SG函数的使用,这个的使用就是将某堆石子分成可分的堆,然后计算它的一个SG函数,最后算出初始堆sg值的异或值,然后判断即可。
AC代码
#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;
const int N = 100010,M = 110;
int f[N],s[M];
int m;
int sg(int t) {
if(f[t] != -1) return f[t];
unordered_set<int> S;
for(int i = 0;i < t;i++) {
for(int j = 0;j<=i;j++) {
S.insert(sg(i) ^ sg(j));
}
}
// 寻找与t相连的所有值中不包含的所有值的最小值
for(int i = 0;;i++) {
if(!S.count(i)){
return f[t] = i;
}
}
}
int main() {
cin>>m;
memset(f,-1,sizeof f);
int res = 0;
for(int i = 0;i < m;i++) {
int t;
cin>>t;
res ^= sg(t);
}
if(res) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}