[C_MM217-中] 第K個重排
成績: 0 / 倒扣: 0.8
問題描述 :
1到N有N個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
現在輸入兩個數字N與K,試求在1到N的重排中,排第K個的是誰。
輸入說明 :
輸入兩個正整數N,K,用空白隔開,0 < N < 25。
輸出說明 :
輸出1到N的重排中,排第K個的重排。輸出時,各數字中間請用空排隔開,兩旁不留空白。
範例 :
1到N有N個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
順序 | 重排 |
1 | 1 2 3 |
2 | 1 3 2 |
3 | 2 1 3 |
4 | 2 3 1 |
5 | 3 1 2 |
6 | 3 2 1 |
輸入說明 :
輸入兩個正整數N,K,用空白隔開,0 < N < 25。
輸出說明 :
輸出1到N的重排中,排第K個的重排。輸出時,各數字中間請用空排隔開,兩旁不留空白。
範例 :
輸入範例 | 輸出範例 |
3 3 | 2 1 3 |
while True:
try:
N, K = map(int,input().split())
def rot(data, n): # 將第n個搬到最後
val = data.pop(n)
data.append(val)
return data
def rot_n_chk(data, n): # 檢查第n個要不要搬
for i in range(n-1):
if data[i] == i:
rot(data, i+1)
else:
break
return data
def chk_stop(data, n): # 檢查所有的位置是否都歸位
res = 1
for i in range(n): # 只要第i位置對 chk=1, 位置不對 chk=0
chk=1 if data[i] == i else 0
res *= chk # 每位的乘積
return res # res乘積為1表示全歸位都輪完了
#data = [i for i in range(1, N+1)] #[1, 2, 3...]
data_i = [i for i in range(N)] #[0, 1, 2...]
data_p = []
while True:
rot(data_i, 0)
rot_n_chk(data_i, N)
#print(num, odata)
b = data_i[:]
data_p.append(b)
if chk_stop(data_i, N):break
r = sorted(data_p)
#print(r[K-1])
strs = ''
for i in r[K-1]:
strs += str(i+1) + ' '
print(strs.strip())
except(EOFError):
break
沒有留言:
張貼留言