游戏中获胜玩家的索引

时间:2015-10-30 13:53:48

标签: algorithm recursion number-theory

N玩家玩游戏。他们的立场使得他们形成了一个普通的N - gon。玩家的编号从1N。球员轮流按顺时针方向投掷回旋镖。首先,玩家1通过多边形的中心投掷回旋镖。如果N是偶数,则回旋镖击中对方的玩家,被击中的玩家离开游戏。如果N是奇数,则相反的点没有玩家,所以回旋镖飞回到投掷它的玩家并击中他,让他离开游戏。玩家离开后,游戏以N-1玩家继续游戏(即他们再次定期(N-1) - gon)。顺时针方向最接近最后一位移动玩家的玩家现在有转弯。

游戏继续进行,直到只剩下一名玩家。在N方面,获胜玩家的索引是否有任何封闭的表单表达式?或者任何快速(对数或更少)的方法来计算指数?

如果f(N)表示答案,那么我想出了一个简单的递归f(2n+1)=f(2n)+1,因为在奇数情况下,玩家1在第一步中出局,然后是{{1}移动。但对于偶数情况没有任何意义。谢谢你的帮助。

前几个值:2

n --> f(n)

2 --> 1

3 --> 2

4 --> 4

5 --> 5

6 --> 1

7 --> 2

8 --> 3

9 --> 4

10 --> 5

11 --> 6

12 --> 8

13 --> 9

14 --> 11

15 --> 12

1 个答案:

答案 0 :(得分:0)

另一个递归就是这样:

如果f(2n-1) >= nf(2n)=f(2n-1)+2 (mod 2n)。 否则,f(2n)=f(2n)+1 (mod 2n)

如果将每个指数的生存时间记为排列,很容易看出这一点。

将递归应用于过零点,我们发现第n个过零点位于4^(n+2)/3

鉴于这一切,这里是找到第n场比赛胜利者的算法:

k <- floor((log(3)+log(n))/log(4))+2
m <- 4^(k+2)/3
if n < 2m: 
    f(n) <- (n-m+1)%n
otherwise: 
    f(n) <- (n+2-m+(n-2*m)/2)%n

前几个值:1,1,2,4,5,1,2,3,4,5,6,8,9,11,12...

f(100)=15f(1000)=818f(10000)=4539f(100000)=12619等等

相关问题