白駿/ジョセフス問題/158


Question
質問リンク
Silver 5
ジョセフス問題は以下の通りです.
1番からN番までは、N人が1つの円に座り、正の整数K(≦N)を与えます.今は順番にK人目を除いています.一人が取り除かれると、残りの人からなる円に沿ってこの過程が続きます.この過程はN人全員がクリアされるまで続く.円上の人々が消去される順序を(N,K)−ジョセフス配列と呼ぶ.例えば、(7,3)−ジョセフス配列<3,6,2,7,5,1,4>である.
NとKをあげると(N,K)-ジョセフスシーケンスを求めるプログラムを書きます.
Input
第1行NとKは、スペースを隔てて順次与えられる.(1 ≤ K ≤ N ≤ 5,000)
7 3
Output
例に示すように、ジョセフスシーケンスを出力します.
<3, 6, 2, 7, 5, 1, 4>
Logic
デフォルト構造:queue
1.N名のリストを作成します.
2.移動Kの位置で余剰演算を行い、絶対位置を求める.
3.位置の要素を削除して出力します.
Code
import sys
idx=0
li=[]
data=input().split()
n=int(data[0])
for i in range(n):
    li.append(i+1)
k=int(data[1])-1
print('<',end='')
while li:
    idx=(idx+k)%n
    print(li[idx],end='')
    del li[idx]
    if li : print(', ',end='')
    n-=1
print('>')