切換
舊版
前往
大廳
主題

ZeroJudge - b573: 排列組合、最大公因數 解題心得

Not In My Back Yard | 2019-04-02 13:35:04 | 巴幣 0 | 人氣 224

題目連結:


題目大意:
第一列給定一正整數 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


範例輸出:
3
12
2
2
1


解題思維:
這題可以把「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 的排列之方法。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作