【水题】
全排列 有单独存在的情况,数学不做就退步啊,都快忘光了。
#include <cstdio>
#include <cstring>
using namespace std;
#define N 22
__int64 f[N],m;
int a[N],v[N];
int main()
{
int n,i,j,num;
f[0]=0;f[1]=1;
for(i=2;i<21;i++) f[i]=i*f[i-1]+i; //全排列问题,在没有单独存在的情况下是n!,
//+i表示每一个数单独存在,i*f[i-1]也要考虑一下意义,情况和上面的不同
while(scanf("%d%I64d",&n,&m)!=EOF)
{
num=0;
memset(v,0,sizeof(v));
while(num<n)
{
if(m==0) break;
for(i=1;i<=n;i++)
{
if(v[i]) continue;
if(m>f[n-num-1]+1) m=m-f[n-num-1]-1; //判断最前面没有确定的数,可以用递归的思想解决
else
{
a[++num]=i;
v[i]=1;
m--;
break;
}
}
}
for(i=1;i<num;i++) printf("%d ",a[i]);
printf("%d\n",a[num]);
}
return 0;
}