序列问题

问题来源:Problem - 2062

问题描述


问题解读:

    这道题的大概意思是:有一个序列A_{n} =\left\{ 1,2……,n \right\} ,比如A_{1} =\left\{ 1 \right\} A_{3} =\left\{ 1,2,3 \right\} 。要求输入一个n和一个m,n表示序列的长度,m表示第m个子集

问题解析:

    当n=1时,子集只有\left\{ 1\right\}

    当n=2时,子集有\left\{ 1 \right\} ,\left\{ 1,2 \right\}

                                  \left\{ 2 \right\} ,\left\{ 2,1 \right\}

    当n=3时,子集有\left\{ 1 \right\} ,\left\{ 1,2 \right\} ,\left\{ 1,2,3 \right\} ,\left\{ 1,3 \right\} ,\left\{ 1,3,2 \right\}

\left\{ 2\right\} ,\left\{ 2,1 \right\} ,\left\{ 2,1,3\right\} ,\left\{ 2,3 \right\} ,\left\{ 2,3,1\right\}

\left\{ 3 \right\} ,\left\{ 3,1 \right\} ,\left\{ 3,1,2 \right\} ,\left\{ 3,2\right\} ,\left\{ 3,2,1 \right\}

    根据上面的可以看出,按照首个元素子相同的子集进行分组,设F(n)为n的每一组子集个数,则F(n)=(n-1)*F(n-1)+1F(1)=1

    接着,算出序号m位于第a组,输出第a组的首元素xa,这样就输出了子集的第一个元素,在原来An数组删除已经xa,m的位置就缩小到第a组内,变成了m=m-(a-1)*F(n)-1(因为该组首元素已经从数组中删去,所以后面要再减一),如果m不等于0,说明后面还有数字,就将第n组分为(n-1)组,然后重复上面的操作。

    拿3 10来举例说明:

    将A3分为3个组,一个组5个子集,可得10是在第2组,输出第2组的首个子集\left\{ 2 \right\} ,在A3中删去2,只剩下\left\{ 1,3\right\} ,m就变成了m=10-(2-1)*5-1=4,说明m是位于第二组删除了\left\{ 2 \right\} 后第四个位置,因为m不等于0,说明后面还有数字,所以将第2组分为2个小组,4位于新的第二组,现在第二个元素是3,故输出\left\{ 3\right\} ,A3中删去3,只剩下\left\{ 1\right\} ,m就变成了m=4-(2-1)*2-1=1,说明m是位于新的第二组删除了\left\{ 3 \right\} 后第1个位置,因为m不等于0,说明后面还有数字,所以将新的第二组分为2个小组,1位于新的第一组,现在第一个元素是1,故输出\left\{ 1\right\} ,最后就输出了2,3,1.

实现代码:

import java.util.Scanner;

public class Test_2062 {

public static void main (String args[]) {

Scanner in = new Scanner(System.in);

int i;

int t; //表示m分配在第几组

int s[] = new int[23];  //每一组的首元素

long c[] = new long[23];  //每一组的元素个数

while(in.hasNextInt()) {

int n = in.nextInt();

long m = in.nextLong();

c[1] = 1;

for(i=2;i<=n;i++) {

c[i] = (i-1) * c[i-1] + 1;

}

for(i=1;i<=n;i++)

s[i] = i;

while(n>0 && m>0) {

t= (int)(m/c[n] + ((m%c[n]>0)?1:0));

if(t > 0) {

System.out.printf("%d",s[t]);

for(i=t;i<=n;i++)

s[i] = s[i+1];

m -= ((t-1)*c[n]+1);

if(m == 0)

System.out.println();

else

System.out.print(" ");

}

n--;

}

}

}

}

;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容