hdu1027

/*
分析:
    嘿嘿,我这代码在提交的里面排名还是挺不错的嘛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;
}


你可能感兴趣的:(hdu1027)