【HDOJ】2062 Subset sequence
这道题目非常好,饶了点儿圈子。我的思路是,先按照组排列。例如,
1 2 3
1 2 2 1 3 1
1 2 3 2 1 3 3 1 2
1 3 2 3 3 2
1 3 2 2 3 1 3 2 1
分成3组,每组个数是确定的,因此可以通过m/组数获得第一个数字,然后组数因n--而减小。重新计算属于哪一组,但此时需要考虑printf的数字,因此使用visit数组保证每个数字仅遍历一次。需要注意的是m应先--,这样第1个和第5个可以保证在同一组内。组后需要注意long long,题目非常好。
#include <stdio.h> #include <string.h> #define MAXNUM 25 long long each_gp[MAXNUM] = {0}; int visit[MAXNUM]; int main() { int n; long long m; long long i, j, k; for (i=1; i<=20; ++i) each_gp[i] = (i-1) * each_gp[i-1] + 1; while (scanf("%d %I64d", &n, &m) != EOF) { memset(visit, 0, sizeof(visit)); m--; k = m / each_gp[n] + 1; printf("%I64d", k); visit[k] = 1; m = m % each_gp[n--]; while (m>0 && n>0) { m--; k = m / each_gp[n] + 1; j = i = 0; do { i++; if (visit[i] == 0) j++; } while(j < k); printf(" %I64d", i); visit[i] = 1; m = m % each_gp[n--]; } printf("\n"); } return 0; }