描述
全排列就是n个不同元素排成一列,我们不妨可以简单地将n个元素理解为自然数1,2,…,n。现假设不同的全排列按照字典序自动从小到大排,123…n的序号为零。编程读入n、m,输出序号为m(m<=n!-1)的全排列。例如n=5,m=2,则输出为:
1 2 4 3 5
输入
一行两个自然数n、m(1<n<20,0<=m<=n!-1)。
输出
序号为m的全排列,每个元素后有一个空格。
样例输入
3 5
样例输出
3 2 1
#include <stdio.h>
int main()
{
char e[21]={0};
long s[21]={1},m,j,k,l;
int i,n;
scanf("%d%ld",&n,&m);
m=m+1;
s[0]=1;
for(i=1;i<=n;i++) s[i]=s[i-1]*i;
for(i=n-1;i>=0;i--)
{
j=(m-1)/s[i]+1;l=0;k=0;
do{
k++;
if(e[k]==0) l++;
}while(l<j);
m-=(m-1)/s[i]*s[i];
e[k]=1;
printf("%d ",k);
//if(i!=0) printf(" ");
}
printf("\n");
return 0;
}