【数学】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;
}
原文地址:https://www.cnblogs.com/purinliang/p/13952913.html