acm新手训练题(Subset sequence)

Problem Description

Consider the aggregate An= { 1, 2, …, n }. For example, A1={1}, A3={1,2,3}. A subset sequence is defined as a array of a non-empty subset. Sort all the subset sequece of An in lexicography order. Your task is to find the m-th one.

Input

The input contains several test cases. Each test case consists of two numbers n and m ( 0< n<= 20, 0< m<= the total number of the subset sequence of An ).

Output

For each test case, you should output the m-th subset sequence of An in one line.
Sample Input

1 1
2 1
2 2
2 3
2 4
3 10
Sample Output

1
1
1 2
2
2 1
2 3 1
题解:通过对3的字集排序
1
1 2
1 2 3
1 3
1 3 2
2
2 1
2 1 3
2 3
2 3 1
3
3 1
3 1 2
3 2
3 2 1
的观察,我们不难发现,可以把A3的子集分为3组,分别由 1 ,2和3牵头,且各组子集个数是相同的,推到An我们也可以把它分为n组,且每一组的个数相同分别由 1 2 3。。。n牵头,那么现在对由1牵头的进行分析,其他类似,看每行的第二个元素,分别可以分为一个空集和2 3 4。。。n牵头的 即有n-1个元素再排序,即第一组的个数相当于A(n-1)子集的个数加一,(以下讨论个数)所以An=n*(A(n-1)+1);通过数学推理可得An=n!/0!+n!/1!+…+n!/(n-1)!。
现在把An的子集进行n层排序如第一层有n组,第二层有n-1组(不包括空组),然后计算出所求的第几个子集分别在各层的第几组,如找第m个子集,那么第一个元素即是p=m/(A(n-1)+1),那么要找第二个元素,则要从头开始找,那么就需要减掉前面的,那么如第一个元素为二的,那么第二个元素就要从第一层的第二组找起,则第二个元素为q=(m-1)*(An-2+1).
代码`

using namespace std;
long long ask(int a)//算n的阶层
{
	if (a == 0) return 1;
	else return a * ask(a - 1);
}
long long asd(int n)//算An的子集个数
{
	long long  sum=0;
	for (int i = 0; i <= n - 1; i++)
	{
		sum += ask(n) / ask(i);
	}return sum;

}
int main()
{
	long long b;
	int a, i, c;
	int k[21] = { 0 };
	for (i = 1; i < 21; i++)
		k[i] = i;
	while (cin >> a >> b)
	{
		int g,p;
		for (i = 1; i < 21; i++)
			k[i] = i;
		if (b % (asd(a - 1) + 1) == 0)
			p = b / (asd(a - 1) + 1);
		else p = b / (asd(a - 1) + 1) + 1;//计算第一个元素在第一成排序的第几组
		c = p - 1;
		for (i = 1; b > 0; i++)
		{
			cout << k[p];
			for(int j=p;j<=a;j++)//对后面元素除掉前面后重新排序
		{
			k[j] = k[j + 1];
		}
			b = b - c * (asd(a - i) + 1) - 1;//算还剩多少可以在下一层排序找
			if (b % (asd(a - i - 1) + 1) == 0)	p= b / (asd(a - i - 1) + 1);
			else p = b / (asd(a - i - 1) + 1) + 1;//找出该元素为改层排序的第几个元素
			c =p- 1;
			if (b != 0)cout << " ";
		}
		cout << endl;

	}
在这里插入代码片

猜你喜欢

转载自blog.csdn.net/weixin_43965698/article/details/85008150
今日推荐