hdu1027

1487 단어
/*
분석:
헤헤, 내 이 코드가 제출한 안에 랭킹이 꽤 괜찮잖아 O() O~
나의 생각을 말해 보아라.
   “temp=1;while(temp*jie[n-key-1]+base_t의temp가 대표하는 작은 것부터 큰 것까지 몇 번째로 사용되지 않은 숫자는 바로 현재 위치ans
에 기입해야 할 수.
그 중에서 jie[x]는 x의 계승이다.base_t는 ans에서 앞에서 정해진 숫자의 꼬리입니다.
의 수량,eg:n=6 시, 현재 세 개 수가 1,2,3으로 확정되면 뒤에
jie[3]에서 상황을 배열하기;키는 이미 앞의 몇 개의 수를 얻었다.
ans[i]를 정할 때마다 baset는 +=(temp-1)*jie[n-key-1]를 원합니다.그래서
의심할 여지없이 ans가 가득 차면baset는 ==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
",ans[i]); } return 0; }

좋은 웹페이지 즐겨찾기