取石子游戏,每次移动可以取 \(1,2,k\) 个石子,无法移动则输。
int k;
int sg[1005];
int SG(int x) {
if(sg[x] != -1)
return sg[x];
int res = 0;
if(x >= 1)
res |= 1 << SG(x - 1);
if(x >= 2)
res |= 1 << SG(x - 2);
if(x >= k)
res |= 1 << SG(x - k);
int i = 0;
while(res & 1) {
res >>= 1;
++i;
}
return sg[x] = i;
}