0、1、2三个数字的全排列有六种,按照字母序排列如下: 012、021、102、120、201、210 输入n, M 求0~n-1十个数的全排列中的第M个(第1个为0 1 2 3 4 .. n-1)。
10 1
0 1 2 3 4 5 6 7 8 9
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[35],b[35],jc[35];
int main(){
cin>>n>>m;
jc[1]=1;
for(long long i=2;i<=19;i++){
jc[i]=jc[i-1]*i;
}
for(long long i=1;i<=n;i++){
for(long long j=0;j<n;j++){
if(b[j]==0){
long long wei=j;
for(long long k=1;k<i;k++){
if(a[k]<j)wei--;
}
if(m>wei*jc[n-i]){
a[i]=j;
}
else break;
}
}
long long g=a[i];
for(long long k=1;k<i;k++){
if(a[k]<a[i])g--;
}
m-=g*jc[n-i];
b[a[i]]=1;
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}