康托逆展开

刚才学弟问,不好意思说不知道康托逆展开是个什么东西= =。然后硬着头皮百度了一下,找到了思路,顺手就敲了一下,发上来吧:

求n个数的第m大的全排列。

思路链接:

戳这里。。。

代码贴出来 :简单的写下注释。。0.0

 1 #include <iostream>
 2 using namespace std;
 3 const int MAXN = 13;
 4 int num[MAXN];
 5 int jie[12]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800};//阶乘存起来省的写函数计算了
 6 void init()
 7 {
 8     for (int i = 0; i < MAXN; ++i)
 9     {
10         num[i]=i;
11     }
12 }
13 void kt_sequence(int n,int m)
14 {
15     if(n<1)return;
16     int x=m-1;
17     int a,b,i;
18     a=x/jie[n-1];
19     b=x%jie[n-1];
20     int temp=0;
21     for(i=0;i<MAXN;++i)        //有a个数比他小的数的位置求出来
22     {
23         if(temp==a+1)break;
24         if(num[i]!=0)temp++;
25     }
26     cout<<num[i-1];
27 
28     num[i-1]=0;                //记得输出过的数要标记下,剔除
29 
30     kt_sequence(n-1,b+1);
31 
32 }
33 int main()
34 {
35     int n,m;
36     
37     while(cin>>n>>m)
38     {
39         init();                //num数组存n个数,方便求位置
40         
41         kt_sequence(n,m);
42         cout<<endl;
43     }
44     return 0;
45 }
原文地址:https://www.cnblogs.com/sylvialucy/p/4905941.html