@Dmaxiya
2019-01-01T10:51:40.000000Z
字数 556
阅读 1185
板子
const int maxn = 10000 + 100;
int n;
int Array[maxn], SG[maxn];
bool visit[maxn];
// maxn 为“石子”数,n 为 Array 数组大小,Array 数组需从小到大排序
void get_SG() {
SG[0] = 0;
for(int i = 1; i <= 10000; ++i) {
memset(visit, 0, sizeof(visit));
for(int j = 0; j < k; ++j) {
if(i >= Array[j]) {
visit[SG[i - Array[j]]] = true;
}
}
for(int j = 0; j <= 10000; ++j) {
if(!visit[j]) {
SG[i] = j;
break;
}
}
}
}
一堆物品有 个,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取 个,取走最后一个物品者获胜。
当 时,先手必败,否则先手必胜。
有两堆物品,分别有 个与 个,两个人轮流取物品,每次可以从任意一堆中取走任意个物品,或者从两堆物品中取走任意多个相同数量的物品,每次最少取一个物品,取走最后一个物品者获胜。
若 , ,则先手必败,否则先手必胜。