约瑟夫斯拼图的线性变异

时间:2010-11-12 12:10:58

标签: algorithm josephus

所以这是维基上的Josephus problem。 我遇到的问题是这个问题的线性变化,但为了清楚起见,我将重申整个问题。

(数字=自然数字)

有一个过程以下列方式消除数字:

i=2
while 1:
    remove numbers that are *placed* at positions divisible by i
    i+=1

您还会获得一个号码K,您必须确认此号码K是否会在消除后继续存在。

E.g。 (假设指数从0开始)

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ...
0,1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15 ...  (indices)

After step 1 ( elimination at i=2 )
2,4,6,8,10,12,14,16 ... 
0,1,2,3, 4, 5, 6, 7 ... (indices)

After step 2 (elimination at i=3 )
2,4,6,10,12,16 ... ( 8 and 14 got removed cause they were at index 3 and 6 resp. )
0,1,2, 3, 4, 5 ... (indices)

在此步骤之后我们可以看到2,4,6是safe,因为该过程将选择越来越高的值来消除。

再一次,给定一个K,您如何确定Ksafe

2 个答案:

答案 0 :(得分:2)

一种解决方案是在每次迭代时跟踪列表中的K的索引。

在每一步,我们首先检查K的索引是否可被整除。如果是,我们返回false。否则,我们简单地从K的索引中减去K之前可以被i整除的元素数(即K向左移动很多次)。

我们继续这样做,直到只留下一个元素。

答案 1 :(得分:2)

问题并未明确指出位置0处的数字究竟发生了什么。在该示例中,在步骤1中,数字1(位置0)被消除。但是在第2步,第2位(在第0位)幸存下来。

我将假设为了这个答案的目的,该例子是错误的,位置0的数字总是存活下来。所以这个例子应该是这样的:

  

初始职位

 Number    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 ...
 Position  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 ... 
     

在第1步之后:

 Number    1  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 ...
 Position  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 ...
     

在第2步之后:

 Number    1  2  4  8 10 14 16 20 22 26 28 32 34 38 40 44 46 ...
 Position  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 ...

这导致序列1,2,4,8,14,20,28,40 ......,即not found in OEIS(但见下面的附录)。

以下是如何在不计算整个序列的情况下确定特定数字K是否存活的方法:

设J 1 = K - 1(K的初始位置)。

    如果J 1> 0和2 | J 1,则在步骤1中消除K,但如果不是,则其新指数为J 2 = J 1 - ⌊J1 /2⌋ 如果J 2> 0和3 | J 2,则在步骤2中消除K,但如果不是,则其新指数为J 3 = J 2 -J 2/3 +
  • 等等,直到K被消除,或者直到Ji <1。 i + 1,当我们知道K幸存时。

附录

当我断定这个序列不在OEIS中时,我有点仓促。假设我们编号的位置从1开始而不是0.然后我们得到序列1,3,7,13,19,27,39 ......这是OEIS sequence A000960,“Flavius Josephus的筛子”。但是,仍然没有封闭形式的解决方案。