有向图游戏模版题,求出每个图的起点的SG值,求异或和即可
注意
- 每一堆石子就是一个有向图,图的起点就是这堆石子起始的数量,不同石子数就是图上不同节点
- 由于每堆石子能取出来的石子数都是相同的,所以只要节点的石子数相同,sg值就相同
#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;
const int NN = 110, MM = 10010;
int n, k, s, h;
int S[NN], f[MM];
int sg(int x){
if (f[x] != -1) return f[x];
unordered_set<int> us;
for (int i = 1; i <= k; i ++){
if (x >= S[i]) us.insert(sg(x - S[i]));
}
for (int i = 0; ; i ++)
if (!us.count(i)) return f[x] = i;
}
int main(){
memset(f, -1, sizeof(f));
cin >> k;
for (int i = 1; i <= k; i ++) cin >> S[i];
int num; cin >> n; int res = 0;
while (n --){
cin >> h;
res ^= sg(h);
}
puts(res ? "Yes" : "No");
return 0;
}