站外题求助ToT
  • 板块学术版
  • 楼主ym_612_04
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/18 15:42
  • 上次更新2024/5/18 18:09:40
查看原帖
站外题求助ToT
1338122
ym_612_04楼主2024/5/18 15:42

问题描述
  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
万分感谢

2024/5/18 15:42
加载中...