标签:
变长编码,这里排列的序号是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("\n");
} int main(){ int n,k; scanf("%d%d",&n,&k); get_kth_permutation(n,k); }
标签:
原文地址:http://www.cnblogs.com/zhjou/p/4758609.html