1 条题解

  • 0
    @ 2026-5-12 20:07:51

    题解

    题意简述

    给定一个n n ,要求构造一个 1n 1 \sim n 的排列 p p ,使得对于每一个 i[2,n]i \in [2, n] 都有:

    max(pi1,pi)modi=i1\max(p_{i-1}, p_i) \bmod i = i-1

    如果无法构造,输出 1-1


    思路分析

    1. 模运算的条件

    对于某个固定的 i i ,条件 max(pi1,pi)modi=i1\max(p_{i-1}, p_i) \bmod i = i-1 等价于:

    max(pi1,pi)i1(modi)\max(p_{i-1}, p_i) \equiv i-1 \pmod{i}

    即:

    $$\max(p_{i-1}, p_i) = i \cdot k + (i-1) \quad (k \ge 0) $$

    由于 max(pi1,pi)n\max(p_{i-1}, p_i) \le n,并且 i1<ii-1 < i,所以有两种可能:

    • k=0k = 0max(pi1,pi)=i1\max(p_{i-1}, p_i) = i-1
    • k1k \ge 1max(pi1,pi)i+(i1)=2i1\max(p_{i-1}, p_i) \ge i + (i-1) = 2i - 1

    但因为排列中元素 n\le n,当 ii 较大时 k1k \ge 1 会很快不可能。我们需要整体构造。


    2. 奇数 nn 的构造

    nn 为奇数时,我们可以构造:

    p=[n, 1, 2, 3, , n1]p = [n,\ 1,\ 2,\ 3,\ \dots,\ n-1]

    验证如下:

    • 对于 i=2i = 2
    max(p1,p2)=max(n,1)=n\max(p_1, p_2) = \max(n, 1) = n

    因为 nn 是奇数,nmod2=1n \bmod 2 = 1,而 i1=1i-1 = 1,满足条件。

    • 对于 i3i \ge 3
    max(pi1,pi)=max(i2,i1)=i1\max(p_{i-1}, p_i) = \max(i-2, i-1) = i-1

    (i1)modi=i1(i-1) \bmod i = i-1,同样满足。

    因此该构造对奇数 nn 有效。


    3. 偶数 nn 不可能

    我们证明对于偶数 nn 不存在这样的排列。

    ① 位置分析
    如果 nnp1p_1p2p_2 位置:

    • p1=np_1 = n,则对于 i=2i=2max(p1,p2)n>n\max(p_1, p_2) \ge n > n(不可能,因为最大值就是 nn?等等,这里逻辑有问题)
      更准确地说,若 p1=np_1 = n,则 max(p1,p2)=n\max(p_1, p_2) = n,要求 nmod2=1n \bmod 2 = 1,但偶数nn 不满足。
    • p2=np_2 = n,则对于i=2i=2max(p1,p2)=n\max(p_1, p_2) = n,同样要求 nmod2=1n \bmod 2 = 1,不成立。

    所以 nn 不能在p1p_1p2p_2

    pn=np_n = n,则对于 i=ni = n

    max(pn1,pn)=max(pn1,n)=n\max(p_{n-1}, p_n) = \max(p_{n-1}, n) = n

    要求 nmodn=n1n \bmod n = n-1,即 0=n10 = n-1,不可能。
    所以nn 也不能在 pnp_n

    因此 nn 必须放在 p3pn1p_3 \sim p_{n-1} 中的某个位置。

    ② 矛盾推导
    xxnn 在排列中的位置(3xn13 \le x \le n-1)。

    于是:

    max(px1,px)=n\max(p_{x-1}, p_x) = n max(px,px+1)=n\max(p_x, p_{x+1}) = n

    这两个 ii分别是 xxx+1x+1

    条件要求:

    nmodx=x1n \bmod x = x-1 nmod(x+1)=xn \bmod (x+1) = x

    考虑两个相邻整数 xxx+1x+1,它们中必有一个是偶数(因为相邻数一奇一偶)。记这个偶数为 mm

    那么有:

    nmodm=m1n \bmod m = m-1

    m1m-1 是奇数,而nn 是偶数,偶数模偶数结果应为偶数,不可能得到奇数。矛盾。

    因此偶数 nn 无解。


    复杂度

    每个测试用例 O(n)O(n) 构造输出,总复杂度 O(n)100×100=O(104)O(\sum n) \le 100 \times 100 = O(10^4)


    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int T, n;
        cin >> T;
        while (T--) {
            cin >> n;
            if (n & 1) {                        // n 为奇数
                cout << n << ' ';
                for (int i = 1; i < n; ++i) {
                    cout << i << " \n"[i == n - 1];
                }
            } else {                            // n 为偶数
                cout << "-1\n";
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    7034
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者