50分求助各位大佬,一半AC,一半RE
查看原帖
50分求助各位大佬,一半AC,一半RE
1201825
LLL_flying楼主2024/10/7 21:23
#include<bits/stdc++.h>
using namespace std;

// 计算阶乘,使用 long long 返回值,避免溢出
long long fac(int n) {
    long long result = 1;
    if(n >= 2) {
        for(int i = 2; i <= n; i++) {
            result *= i;
        }
    }
    return result;
}

// 计算给定排列的位置
long long findpos(const vector<int>& perm) {
    int n = perm.size();
    vector<int> used(n, 0); // 标记已使用的元素
    long long pos = 1; // 使用 long long 避免溢出
    for (int i = 0; i < n; i++) {
        int k = 0; // 小于当前元素的元素个数
        for (int j = 0; j < n; j++) {
            if (!used[j] && perm[i] > j + 1) {
                k++;
            }
        }
        pos += k * fac(n - i - 1); // 累计位置
        used[perm[i] - 1] = 1; // 标记已使用
    }
    return pos;
}

// 根据给定的数字生成对应的排列
vector<int> conpos(int n, long long k) {
    vector<int> result;   // 存储结果排列
    vector<int> available; // 存储可用的数字
    for (int i = 1; i <= n; i++) {
        available.push_back(i); // 初始化为 [1, 2, ..., n]
    }

    k--; // 因为排列编号从 1 开始,而下标从 0 开始,所以要将 k 减 1

    for (int i = 0; i < n; i++) {
        long long fact = fac(n - i - 1); // 剩余的排列种数
        int index = k / fact; // 计算当前位对应的数字
        result.push_back(available[index]); // 将该数字加入结果
        available.erase(available.begin() + index); // 从可用数字中移除已使用的
        k %= fact; // 更新 k 为下一个位置的相对位置
    }

    return result;
}

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> a(N); // 修正数组大小,初始化为 N 个元素
    for (int i = 0; i < N; i++) { // 修正循环边界
        cin >> a[i]; // 输入 N 个元素
    }

    // 计算当前排列的字典序位置
    long long pos = findpos(a); // 使用 long long 接收位置

    // 计算排列总数,即 N!,用于检查是否超出范围
    long long total_permutations = fac(N);

    // 计算目标排列的位置,限制范围在 1 到 total_permutations 之间
    long long num = pos + M;
    if (num > total_permutations) {
        num = (num - 1) % total_permutations + 1; // 确保 num 不超过排列范围
    }

    // 根据计算出的 num 生成对应的排列
    vector<int> permutation = conpos(N, num);
    
    // 输出排列
    for (int i = 0; i < N; i++) {
        cout << permutation[i] << " ";
    }
    cout << endl;

    return 0;
}
2024/10/7 21:23
加载中...