【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("
");
    }

    return 0;
}
原文地址:https://www.cnblogs.com/bombe1013/p/3596237.html