# 86 T4## 题目描述已知 $n$ 和一个 $1sim n$ 的排列这个排列对应所有 $1sim n$ 的排列按字典序排序之后的位次。例如当 $n=3$ 时有如下: 排列 代表的数字 -- $123$ $1$ $132$ $2$ $213$ $3$ $231$ $4$ $312$ $5$ $321$ $6$ 现在已知 $n$ 和这个排列求将这个排列对应的数加上 $m$
#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;
}
``
原文地址: http://www.cveoy.top/t/topic/iJJM 著作权归作者所有。请勿转载和采集!