//参数int s[]为待展开之数的各位数字,如需展开2134,则s[4]={2,1,3,4}.long int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//阶层表
long cantor(int s[],int n)
{
long int i,j,temp,num;
num=0;
for(i=0;i<n;i++){
temp=0;
for(int j=i+1;j<n;j++){
if (s[j]<s[i]) temp++;//判断几个数小于其
}
num+=fac[n-i-1]*temp;//(或num=num+fac[n-i-1]*temp;)
}
return (num+1);
}
逆康托展开: int fac[] = {1,1,2,6,24,120,720,5040,40320,362880};
int[] uncantor(int x, int k) {
int res[] = new int[9];
int i, j, l, t;
boolean h[] = new boolean[12];
for (i = 1; i <= k; i++) {
t = x / fac[k - i];
x -= t * fac[k - i];
for (j = 1, l = 0; l <= t; j++)
if (!h[j])l++;
j--;
h[j] = true;
res[i - 1] = j;
}
return res;
}
#include<stdio.h>
#include<string.h>
long long sum[15]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600}; //存的是0~12的阶乘..
int main()
{
long long k,a,b,m,n,i,j;
scanf("%lld",&k);
while(k--)
{
long long max;
int ok[15];
memset(ok,0,sizeof(ok));
scanf("%lld",&max);
max--;//注意。。
for(a=12;a>0;a--)
{
j=max/sum[a-1];
i=0;
max=max%sum[a-1];
for(b=1;b<=12;b++)
{
if(ok[b]==0)
{i++;}
if(i==j+1) //i就是个count 统计有多少满足要求了,直到满足要求后,得到这是的b。例如 12345 而4 已经出现在前面。
但是要求 j为3 则这是要返回5!!!!!!!!!!
break;
}
printf("%c",b+96);
ok[b]=1; //标记。。
}
printf("\n");
}
}