【数学】SG函数

取石子游戏,每次移动可以取 \(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;
}
posted @ 2020-11-10 11:29  purinliang  阅读(91)  评论(0编辑  收藏  举报