问题描述
0、1、2三个数字的全排列有六种,按照字母序排列如下:
012、021、102、120、201、210
输入n, M
求0~n-1十个数的全排列中的第M个(第1个为0 1 2 3 4 .. n-1)。
输入格式
一行,包含n, M
输出格式
一行,包含一组n个数字的全排列
样例输入
10 1
样例输出
0 1 2 3 4 5 6 7 8 9
样例输入
15 1307674368000
样例输出
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
数据规模和约定
0 < M <= 10^18, 0<n<30
我的代码内存超限了:
#include <iostream>
#include <vector>
using namespace std;
long long factorial(int n) {
long long result = 1;
for (int i = 2; i <= n; ++i) {
result *= i;
if (result > 1e18) {
return -1;
}
}
return result;
}
vector<int> generatePermutation(int n, long long M) {
vector<int> permutation(n);
vector<bool> used(n, false);
for (int i = 0; i < n; ++i) {
int size = 0;
for (int j = 0; j < n; ++j) {
if (!used[j]) {
++size;
}
}
long long fact = factorial(size - 1);
if (fact == -1) {
return {};
}
int rank = M / fact;
M %= fact;
for (int j = 0; j < n; ++j) {
if (!used[j]) {
if (rank == 0) {
permutation[i] = j;
used[j] = true;
break;
}
--rank;
}
}
}
return permutation;
}
int main() {
int n;
long long M;
cin >> n >> M;
vector<int> permutation = generatePermutation(n, M - 1);
for (int i = 0; i < n; ++i) {
cout << permutation[i];
if (i < n - 1) {
cout << " ";
}
}
cout << endl;
return 0;
}
哪位dalao能帮我一下ToT
万分感谢