/*
分析:
嘿嘿,我这代码在提交的里面排名还是挺不错的嘛O(∩_∩)O~
说下我的思路吧:
“temp=1;while(temp*jie[n-key-1]+base_t<m;temp++);”得出
的temp所代表的从小到大第几个没有被使用的数,就是当前位置ans
中应该填上的数。
其中jie[x]是x的阶乘;base_t是ans中前面已经确定的数的尾巴
的数量,eg:n=6的时候,当前三个数确定为1,2,3,那么后面可以有
jie[3]中排列情况;key代表已经得到前“几”个数了。
每确定一个ans[i]后,base_t要+=(temp-1)*jie[n-key-1]。所以
毫无疑问的,当ans填满后,base_t是==m滴。
2012-05-23
*/
#include"stdio.h"
#include"string.h"
int main()
{
int n,m;
int key,ans[1011];
int jie[10];
int i,l;
int temp,up;
int base,base_t;
int hash[10];
///jie
jie[0]=1;
jie[1]=1;
for(i=2;i<10;i++) jie[i]=i*jie[i-1];
while(scanf("%d%d",&n,&m)!=-1)
{
memset(hash,0,sizeof(hash)); //注意:hash从0开始用,base和其照应
base=1;
key=0;
///筛
/*****/
if(n>=9)
{
i=1;
while(n-key>=9)
ans[key++]=i++;
base=i;
}
/*****/
up=n-key;
base_t=0; //这个base_t和m照应
while(key<n)
{
for(temp=1;temp*jie[n-key-1]+base_t<m;temp++);
for(i=0,l=1;i<up;i++,l++)
{
if(hash[i]) l--;
if(l==temp) break;
}
base_t+=(temp-1)*jie[n-key-1];
ans[key++]=i+base;
hash[i]=1;
}
for(i=0;i<n-1;i++) printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return 0;
}