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;
}
}
有人可以解释它为什么起作用吗?