0

CSES 问题 Josephus 问题 I 要求我们打印 n 人和 k = 2 时如何选择人的顺序。我在这里找到了一个优雅的解决方案。基本上,代码与此类似:

void J(int n)
{
    int a = 1, b = 0;
    while (n > 0)
    {
        for (int i = 2; i <= n; i += 2)
        {
            cout << a * i + b << ' ';
        }
        if (n & 1)
            cout << a + b << ' ', b += a;
        else
            b -= a;
        a <<= 1;
        n >>= 1;
    }
}

有人可以解释它为什么起作用吗?

4

0 回答 0