#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    int M;
    cin >> M;
    vector<int> permutation(N);
    for (int i = 0; i < N; i++) {
        cin >> permutation[i];
    }

    // 将排列转化为对应的数字
    int number = 0;
    for (int i = 0; i < N; i++) {
        int count = 0;
        for (int j = i + 1; j < N; j++) {
            if (permutation[j] < permutation[i]) {
                count++;
            }
        }
        number += count * factorial(N - i - 1);
    }

    // 对数字加上M
    number += M;

    // 将数字转化为对应的排列
    vector<int> result(N);
    vector<int> candidates(N);
    for (int i = 1; i <= N; i++) {
        candidates[i - 1] = i;
    }
    for (int i = 0; i < N; i++) {
        int index = number / factorial(N - i - 1);
        result[i] = candidates[index];
        candidates.erase(candidates.begin() + index);
        number %= factorial(N - i - 1);
    }

    // 输出结果
    for (int i = 0; i < N; i++) {
        cout << result[i] << " ";
    }
    cout << endl;

    return 0;
}

// 计算阶乘
int factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}
``
# 86 T4## 题目描述已知 $n$ 和一个 $1sim n$ 的排列这个排列对应所有 $1sim n$ 的排列按字典序排序之后的位次。例如当 $n=3$ 时有如下: 排列 代表的数字 -- $123$ $1$ $132$ $2$ $213$ $3$ $231$ $4$ $312$ $5$ $321$ $6$ 现在已知 $n$ 和这个排列求将这个排列对应的数加上 $m$

原文地址: http://www.cveoy.top/t/topic/iJJM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录