http://acm.hdu.edu.cn/showproblem.php?pid=1027
此题没什么算法,就是考组合数学吧!细节想了好久~
/*************************************************************************
> File Name: main.cpp
> Author: huangshuai
> Mail: huangshuai1993@gmail.com
> Created Time: Wed 13 Mar 2013 12:04:31 PM CST
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int xx[10]={0,1,2,6,24,120,720,5040,40320};
int num[1005];
void inser(int a,int b)
{
int t=num[b];
int i;
for(i=b-1;i>=a;i--)
{
num[i+1]=num[i];
}
num[a]=t;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=1;i<=n;i++)
num[i]=i;
while(m>1)
{
for(i=1;i<=8;i++)
{
if(m>xx[i])
;
else
break;
}
int t=(m-1)/xx[i-1];
inser(n-i+1,n-i+1+t);
m=m-t*xx[i-1];
}
printf("%d",num[1]);
for(i=2;i<=n;i++)
printf(" %d",num[i]);
printf("\n");
}