第k个排列数

变长编码,这里排列的序号是0到n!-1,假设求 1,2,3,4 的第15个排列数,15/(3!) = 2, 余数是3,第一个数是(1,2,3,4)中的第二个数 3 (这里0是开始位置),3/(2!) = 1, 余数是1,第二个数就是(1,2,4)中的第一个数 2,  1/(1!) = 1, 余数是0,第三个数(1,4)中的第1个数就是4, 最后一个数就是1。结果就是3,2,4,1

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

void get_kth_permutation(int n,int k){
    vector<int> vec;
    vector<int> fac;
    vector<int> ret;
    int t = 1;
    for(int i=0;i<n;i++){
        t*=i+1;
        fac.push_back(t);
        vec.push_back(i+1);
    }
    for(int i=n-2;i>=0;i--){
        int idx = k/fac[i];
        k %= fac[i];
        ret.push_back(vec[idx]);
        vec.erase(vec.begin()+idx);
    }
    if(!vec.empty())
        ret.push_back(vec[0]);
    for(int i=0;i<n;i++){
        printf("%d ",ret[i]);
    }
    printf(" ");
}
int main(){ int n,k; scanf("%d%d",&n,&k); get_kth_permutation(n,k); }
原文地址:https://www.cnblogs.com/zhjou/p/4758609.html