约瑟夫问题规律讨论

2020-03-05  本文已影响0人  江海小流

考虑这样一个问题,有 n 个人,标号从 1n,从第一个人开始数,杀死数到 3 的人,然后下一个人重新开始数。
问:最后死的人是几号?

假设有 10 个人,将没有被杀的人重新编号,那么,杀人情况如下表所示

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22
23 24 25
26 27
28
29
30

第一轮杀了 3 号、6 号和 9 号,1 号变成了 11 号,2 号变成了 12 号等等。

我们可以发现如下性质:

因此对于第 n 个被杀死的人,他死亡时编号为 N = 3n,又因为 N = n + 2k + 1N = n + 2k + 2,显然 k = \lfloor \frac {N - n - 1} {2} \rfloor,而上一轮的编号为 N' = k + N - n
因此可以用下面的方法算出最后一个死的人的原编号

int J(int n) {
    int i = 3 * n;
    while (i > n) i = (i - n - 1) / 2 + i - n;
    return i;
}

如果用 N = 3n + 1 - D 来替换 N,发现原迭代式变为 D = \lceil \frac {3}{2} D \rceil

则可以用以下方法求出上面要求的结果

int J(int n) {
    int i = 1;
    while (i <= 2*n) i = ceil(3.0 * i / 2);
    return 3*n + 1 - i;
}

当然,如果循环节的个数不为 3,而是为 q,可以用相同的方法证明,有类似的结论

int J(int n, int q) {
    int i = 1;
    while (i <= (q - 1) * n) d = ceil((double)q * i / (q - 1));
    return q*n + 1 - i;
}
上一篇 下一篇

猜你喜欢

热点阅读