題目連結:
題目大意:
第一列給定一正整數 n (2 ≦ n ≦ 5),代表有 n 筆測試資料。每筆測試資料佔一列,每一列會先給定一正整數 i (i 只會是 12 、 123 、 1234 、 12345 或是 123456 其中一者),代表要以 i 的位數數字作為排序的依據。
接著給定兩正整數 j 、 k ,代表要找出 i 的位數數字之由小到大的排列的第 j 、 k 個數字,並求兩者的最大公因數。
5
12 1 2
123 2 5
1234 15 9
1234 3 4
1234 2 5
這題可以把「12」、「123」等等的數字當作字串,並使用 <algorithm> 底下的 next_permutation() 函式,去慢慢地找到第 j 以及第 k 個排列。再用經典的輾轉相除法求出兩者的最大公因數。
也可以直接用算的算出第 j 、 k 個排列。設 i = 1234,j = 4,k = 7 。
因為 j ≦ 6 ,所以我們知道其一定是1開頭的,並將 j 取 6 的餘數為 4 ;接著 2 < j ≦ 4 ,所以 1 後面接著的是 3 (排除 1 之後第 2 小的數字)。並將 j 取 2 的餘數,但是不能為 0 ,所以為 2 ;接著 1< j ≦ 2 ,所以 3 後面接著 4 (除掉 1 、 3 之後的第 2 小的數字)。
因此,我們得到 i 的第 j 個排列為 1342 。同理,i 的第 k 個排列為 2134 。兩者的最大公因數為 22 。
以上,即是用計算的算出 i 的排列之方法。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。