1 条题解

  • 0
    @ 2026-4-11 22:34:36

    题目回顾

    给定一个长度为 nn 的排列 pp,构造一个长度为 nn 的排列 qq,满足: 对所有 1i<n1 \le i < n,有

    gcd(pi+qi, pi+1+qi+1)3\gcd(p_i+q_i,\ p_{i+1}+q_{i+1}) \ge 3

    核心解法

    构造方案

    直接令:

    qi=n+1piq_i = n+1-p_i

    这个构造方式可以完美满足题目所有要求,且实现简单。


    严谨证明

    1. 证明 qq 是一个合法排列

    排列的定义:数组包含 1n1 \sim n 的所有整数,无重复、无遗漏

    1. 由构造公式得:pi+qi=n+1p_i + q_i = n+1
    2. 已知 pp1n1 \sim n 的排列,即 pi[1,n]p_i \in [1,n],因此:qi=n+1pi[1,n]q_i = n+1-p_i \in [1,n]
    3. 因为 pp 中所有元素互不相同,所以 qi=n+1piq_i = n+1-p_i互不相同

    综上,qq1n1 \sim n 的合法排列。


    2. 证明相邻和的 gcd3\gcd \ge 3

    1. 根据构造公式:pi+qi=n+1p_i+q_i = n+1 pi+1+qi+1=n+1p_{i+1}+q_{i+1} = n+1
    2. 两个相等的数的最大公约数等于它本身:gcd(n+1, n+1)=n+1\gcd(n+1,\ n+1) = n+1
    3. 题目约束 n2n \ge 2,因此:n+13n+1 \ge 3

    最终可得:

    gcd(pi+qi, pi+1+qi+1)=n+13\gcd(p_i+q_i,\ p_{i+1}+q_{i+1}) = n+1 \ge 3

    完全满足题目要求。


    代码实现(C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        // 加速输入输出,应对大数据范围
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            for (int i = 0; i < n; ++i) {
                int x;
                cin >> x;
                // 核心构造公式
                cout << n + 1 - x << " ";
            }
            cout << "\n";
        }
        return 0;
    }
    

    代码说明

    1. 输入优化ios::sync_with_stdio(false); cin.tie(nullptr); 用于处理题目大数据量(n2×105n \le 2 \times 10^5);
    2. 核心逻辑:对每个输入的 pip_i,直接计算 n+1pin+1-p_i 并输出,就是答案排列 qq
    3. 效率:时间复杂度 O(n)O(n),空间复杂度 O(1)O(1),完全符合题目限制。

    样例验证

    以第一个样例为例: n=3, p=[1,3,2]n=3,\ p=[1,3,2] q1=3+11=3q_1=3+1-1=3?不影响正确性,题目允许任意合法解) 核心结论:所有相邻和都等于 n+1n+1gcd\gcd 必然满足条件


    总结

    1. 构造公式:qi=n+1pi\boldsymbol{q_i = n+1-p_i}
    2. 该公式保证 qq 是排列,且所有相邻和相等,gcd=n+13\gcd = n+1 \ge 3
    3. 代码极简,时间/空间效率最优,可直接通过所有测试用例。
    • 1

    信息

    ID
    6489
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者