N
玩家玩游戏。他们的立场使得他们形成了一个普通的N
- gon。玩家的编号从1
到N
。球员轮流按顺时针方向投掷回旋镖。首先,玩家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
答案 0 :(得分:0)
另一个递归就是这样:
如果f(2n-1) >= n
,f(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)=15
,f(1000)=818
,f(10000)=4539
,f(100000)=12619
等等