排列的逆序

 

排列的逆序

Grade: 10 / Discount: 0.8

Time Limit:1000MS Memory Limit:65536K

题目描述:
给出正整数 n ,则 1 到 n 这 n 个数可以构成 n !种排列。设 i1 … in 是一个排列,则 a1 … an 是它的逆序列,其中 aj 是 j 的左边大于 j 的数的个数。把这些排列按照逆序列从小到大的顺序列出,如 n=3 时,列出 1 2 3 , 1 3 2 , 2 1 3 , 3 1 2 , 2 3 1 , 3 2 1 六个排列,因为它们的逆序列分别是 0 0 0 , 0 1 0 , 1 0 0 , 1 1 0 , 2 0 0 , 2 1 0 。
任务描述:
给出一个数 n 和 k ,求 1 到 n 排列中按逆序列从小到大的顺序下的第 k 个排列。
比如: n = 3 , k=2 ,则答案是 1 3 2 。

Input
第一行是一个正整数 m ,表示测试数据的个数,下面是 m 组测试数据,每组测试数据一行两个正整数 n( 1 <= n < 12 ) 和 k(1<=k<=n!) 。

Output
对于每组输入数据,输出一行, n 个数,中间用空格隔开,表示逆序列从小到大顺序下的第 k 个排列。

Sample Input

3

3 1

3 6

10 100

Sample Output

1 2 3

3 2 1

1 2 3 4 5 7 10 8 9 6

命题:刘庆晖

 

#include<stdio.h>
#include<string.h>
int t[20];
int a[20];
int main()
{
	int cases;
	int n,k;
	int i,j;
	int cnt;
	scanf("%d",&cases);
	while(cases--)
	{
		memset(a,0,sizeof(a));
		scanf("%d %d",&n,&k);
		j=n;
		k--;
		for(i=1;i<=n;i++)
		{
			t[j--]=k%i;
			k=k/i;
		}

		for(i=1;i<=n;i++)
		{
			cnt=0;
			for(j=1;;j++)
			{
				if(a[j]==0)
				{
					if(cnt>=t[i])
						break;
					cnt++;
				}
			}
			a[j]=i;
		}

		for(i=1;i<=n;i++)
		{
			printf("%d",a[i]);
			if(i<n)
				printf(" ");
		}
		printf("\n");
	}
	return 0;
}


 

你可能感兴趣的:(测试,input,任务,output)