NYOJ143 第几是谁?(逆康托展开)

描述

现在有”abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的。但是现在我们给出它是第几小,需要你求出它所代表的序列.

输入

第一行有一个整数n(0

输出

输出一个序列,占一行,代表着第m小的序列。

样例输入

3
1
302715242
260726926

样例输出

abcdefghijkl
hgebkflacdji
gfkedhjblcia

思路

nyoj139的镜像题目,用了康拓逆展开,关于康拓展开,可以查看维基百科:康托展开

代码

#include <bits/stdc++.h>
using namespace std;
int jc[13]= {1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};
int num[13];//num[i]存储从小到大第i个未用过的字母编号
void init()
{
    for(int i=0; i<13; i++)
        num[i]=i;
}
string get_string(int cnt)//逆展开
{
    string ans="";
    for(int i=0; i<12; i++)
    {
        int tmp=cnt/jc[11-i];
        ans+=num[tmp]+'a';
        for(int j=tmp; j<11; j++)
            num[j]=num[j+1];
        cnt%=jc[11-i];
    }
    return ans;
}
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        init();
        cout<<get_string(n-1)<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/riba2534/article/details/80032654