第Q個全排列

2021-10-03 05:49:55 字數 1036 閱讀 1478

現有乙個長度為n的集合s,集合s裡的元素為 [1,2,3……n]。按照高中數學的知識,我們顯然可以知道,集合裡的元素的排列共有 n! 種。現在給你集合長度n以及乙個正整數 q,請你找出集合元素組成的第q個的排列。

輸入資料由多組測試樣例組成,每組測試樣例第一行分別輸入兩個正整數n ( 1 <= n <= 9 ),q( 1 <= q <= n! )

輸出第q個的排列,元素之間沒有空格

樣例輸入
2 2

5 10

樣例輸出
21

13452

按照題目中第一組測試樣例舉例:

按從小到大順序列出所有排列情況,當 n = 2 時, 所有排列如下:

1 22 1

所以第二大的排列是 21

先學 康托展開和逆康托展開

假設數首位為a

能求出比它小的組合的個數為x*(n-1)!

x等於陣列中小於a的個數

由於a已經使用,所以第二位計算時要從陣列中剔除a

把他變成最大就相當於刪除了

反之也可以根據排列所在的位置求出排列組合。

第一遍不知哪錯,全刪了重打就過了

#include

using

namespace std;

int a[

10000]=

;int v[

10000]=

;int n,q;

int s[10]

=;intmain()

for(

int i=n-

1;i>=

1;i--

) sum=sum*

10+a[0]

;printf

("%d\n"

,sum);}

}

排列演算法彙總(下乙個排列,全排列,第K個排列)

一 下乙個排列 首先,stl提供了兩個用來計算排列組合關係的演算法,分別是next permutation和prev permutation。next permutation nums.begin nums.end 下乙個排列 prev permutation nums.begin nums.end...

LeetCode第46題 全排列

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 全排列問題都可以用dfs 深度優先遍歷 解決,不過這個題是帶權型別的 自稱 所以需要標記位。大致畫了個圖如下 param nums 傳入陣列 ...

C n個元素全排列

一 n個字元全排列列舉 include using namespace std voidf char a,int k k表示當前的交換位置,與其後的元素交換 cout endl return for i k i 4 i intmain 注 字串長度為4二 遞迴實現排列型列舉 1到n數字的全排列 in...