题目链接:HDU 2062 Subset sequence.
题目:
分析
题意要求把数组1~n的子数组按照字典序排列
求第m个子数组
我们可以认为第一个数字是几打头就是第几堆
比如
2,1,3就是第二堆
6,1,3就是第六堆
另外
arr[n]=arr[n-1]*(n-1)+1; 求出所有n所对应的当前堆的子数组个数
set集合用于容纳所有的数字
以3为例
AC代码:
package Three;
import java.util.*;
public class T2062 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long arr[] = new long[21];
arr[1] = 1;
for (int i = 2; i < 21; i++)
arr[i] = arr[i - 1] * (i - 1) + 1;
while (sc.hasNext()) {
int n = sc.nextInt();
long m = sc.nextLong();
LinkedList<Long> set = new LinkedList<Long>();
for (int i = 1; i <= n; i++)
set.add((long) i);
boolean flag = true;
do {
long t = (m - 1) / arr[n] + 1;
System.out.print((flag ? "" : " ") + set.get((int) (t - 1)));
flag = false;
set.remove((int) (t - 1));
m = m - ((t - 1) * arr[n] + 1);
n--;
} while (n > 0 && m > 0);
System.out.println();
}
}
}