HDU 6628 permutation 1 (暴力)

2019 杭电多校 5 1005

题目链接:HDU 6628

比赛链接:2019 Multi-University Training Contest 5

Problem Description

A sequence of length is called a permutation if and only if it's composed of the first positive integers and each number appears exactly once.

Here we define the "difference sequence" of a permutation as . In other words, the length of the difference sequence is and the -th term is

Now, you are given two integers . Please find the permutation with length such that the difference sequence of which is the -th lexicographically smallest among all difference sequences of all permutations of length .

Input

The first line contains one integer indicating that there are tests.

Each test consists of two integers in a single line.

Output

For each test, please output integers in a single line. Those integers represent a permutation of to , and its difference sequence is the -th lexicographically smallest.

Sample Input

7
3 1
3 2
3 3
3 4
3 5
3 6
20 10000

Sample Output

3 1 2
3 2 1
2 1 3
2 3 1
1 2 3
1 3 2
20 1 2 3 4 5 6 7 8 9 10 11 13 19 18 14 16 15 17 12

Solution

题意:

定义排列 的 "difference sequence" 为 。现在给定 ,求长度为 的所有排列中 "difference sequence" 的字典序第 小的排列。

题解:

暴力 STL 全排列

题目给定 的范围不超过 ,而 ,因此可以预处理 的情况,当 时暴力求 的全排列。

Code

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;

struct P {
    int num[10];
    string str;
} ans[10][maxn];

int cmp(P p1, P p2) {
    return p1.str < p2.str;
}

int main() {
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    for(int i = 2; i <= 8; ++i) {
        int cnt = 1;
        do {
            // for(int j = 0; j < i; ++j) {
            //     cout << a[j] << " ";
            // }
            // cout << endl;
            for(int j = 1; j <= i; ++j) {
                ans[i][cnt].num[j] = a[j];
                if(j < i) ans[i][cnt].str += a[j + 1] - a[j] + 'A';
            }
            ++cnt;
        } while(next_permutation(a + 1, a + 1 + i));
        sort(ans[i] + 1, ans[i] + cnt, cmp);
        // for(int j = 1; j < cnt; ++j) { for(int k = 1; k <= i; ++k) cout << ans[i][j].num[k] << ""; cout << endl;}
    }
    int T;
    cin >> T;
    while(T--) {
        int n, k;
        scanf("%d%d", &n, &k);
        if(n <= 8) {
            for(int j = 1; j <= n; ++j) {
                printf("%d", ans[n][k].num[j]);
                printf("%s", j == n? "\n": " ");
            }
        } else {
            int a[30];
            a[1] = n;
            for(int i = 2; i <= n; ++i) {
                a[i] = i - 1;
            }
            for(int i = 0; i < k - 1; ++i) {
                next_permutation(a + 1, a + 1 + n);
            }
            for(int i = 1; i <= n; ++i) {
                printf("%d", a[i]);
                printf("%s", i == n? "\n": " ");
            }
        }
    }
    return 0;
}
全部评论

相关推荐

云边有个小卖铺儿:校招生违约率低,所以我要高😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务