TLE帮助改正一下吧

我们将所有的排列按照如下规则进行排序:

如果长度不同,那么长度小的排前面;否则,字典序小的排前面。

请找到按照这个规则排序得到的第n 个排列。
输入格式:
一个正整数表示 n。
输出格式
一个序列表示答案。
样例输入1:
6
样例输出1:
2 1 3
这样是TLE,望帮忙改正

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
 
using namespace std;
int jiecheng(int x){
    int y=1; 
    for(int i=1;i<=x;i++){
        y*=x;
    }
    return y;
}
int a[1000]={0};//保存数列的数组,默认每个位置都是0
int  book[1000]={0};//记录一个数有没有在数组里
int n,x=-1;//1~n
int k;
void A(int pos)//向a[pos]填数
{
    if(pos==k+1)//递归边界
    {    x++;
    if(x==n){
        for(int i=1;i<=k;i++)//输出数列
            printf("%d ",a[i]);
        printf("\n");
     }
        return;
    }
    for(int i=1;i<=k;i++)
    {
        if(book[i]==0)//如果i没有在数组里面
        {
            a[pos]=i;
            book[i]=1;
            A(pos+1);//向a[pos+1]填数
            a[pos]=0;
            book[i]=0;//收回,试下一个数
        }
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
     int s=0;
    scanf("%d",&n);
    for(k=0;k<n;k++){
        A(1);
    }
 
    return 0;
}

其实只要把k<n改一下就好了

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
   
using namespace std;
int jc[11]={1,2,6,24,120,720,5040,40320,362800,3628800};
int a[1000]={0};//保存数列的数组,默认每个位置都是0
int  book[1000]={0};//记录一个数有没有在数组里
int n,x=-1;//1~n
int k;
void A(int pos)//向a[pos]填数
{
    if(pos==k+1)//递归边界
    {   x++;
    if(x==n){
        for(int i=1;i<=k;i++)//输出数列
            printf("%d ",a[i]);
        printf("\n");
    }
        return;
    }
    for(int i=1;i<=k;i++)
    {
        if(book[i]==0)//如果i没有在数组里面
        {
            a[pos]=i;
            book[i]=1;
            A(pos+1);//向a[pos+1]填数
            a[pos]=0;
            book[i]=0;//收回,试下一个数
        }
    }
}
int main()
{
    int s=0;
    scanf("%d",&n);
    int c;
    for(int i=0;i<9;i++){
        if(n<=jc[i]){
            c=i+1;
            break;
        }
    }
    for(k=0;k<=c;k++){
        A(1);
    }
   
    return 0;
}

确定它在第几个阶乘就好,打个表而已