• 第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); }
  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/zhjou/p/4758609.html
Copyright © 2020-2023  润新知