题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=143
描述 现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的。但是现在我们给出它是第几小,需要你求出它所代表的序列.-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个整数m,它代表着序列的第几小;
输出
- 输出一个序列,占一行,代表着第m小的序列。 样例输入
-
3 1 302715242 260726926
样例输出
-
abcdefghijkl hgebkflacdji gfkedhjblcia
逆康拓展开,定理可看:http://blog.csdn.net/baodream/article/details/79586804
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll fac[21];
int ans[20];
void reverse_cantor(int n,ll m)
{
m--;
int vis[20]={0};
for(int i=n-1;i>=0;i--)
{
int tmp=m/fac[i];
int k=m%fac[i];
int cnt=0,j;
for(j=1;j<=n;j++)
{
if(vis[j]==0)
cnt++;
if(cnt==tmp+1)
break;
}
ans[i]=j;
vis[j]=1;
m=k;
}
}
int main()
{
int t;
scanf("%d",&t);
fac[0]=1;
for(int i=1;i<=20;i++)
fac[i]=fac[i-1]*i;
char a[20];
ll n;
while(t--)
{
scanf("%lld",&n);
reverse_cantor(12,n);
for(ll i=11;i>=0;i--)
printf("%c",ans[i]-1+'a');
puts("");
}
return 0;
}