康拓展开及其逆展开

#include<bits/stdc++.h>

using namespace std;
const int maxn = 100000000+100;

int n, m, cnt;

int f[]  = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int fun(int *a, int n)
{
    int s = 0;
    for(int i=0; i<n; i++){
        int c = 0;
        for(int j=i+1; j<n; j++){
            if(a[j] < a[i])
                c++;
        }
        s += f[n-i-1] * c;
    }
    return s;
}
int main()
{
    int a[150];
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> a[i];
    }
    cout << fun(a,n);
    return 0;
}
/*
5
3 4 1 5 2
61
*/
康拓展开
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int f[]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};

char s[150];
int n,x,v[150],a[150];
void fun()
{
   int k;
   for(int i=1; i<=n; i++) v[i]=1;
   for(int i=1; i<=n; i++){
        k = x / f[n-i];
        x %= f[n-i];
        for(int j=1; j<=n; j++){
            if(!v[j]) continue;
            if(!k) {v[j]=0; a[i]=j; break;}
            k--;
        }
   }
   for(int i=1; i<=n; i++)
       cout<<a[i];
}
int main()
{
    cin >> n >> x;
    fun();
    return 0;
}
康托逆展开
原文地址:https://www.cnblogs.com/Roni-i/p/8818846.html