描述
现在有”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;
}