华黎卡的排列构造

华黎卡的排列构造 

题目描述

华黎卡有一个长度为 $n$ 的神秘排列 $p$。记 $S_k = \sum_{i=1}^k {p_i}$,如果对于所有的 $1 \leq i \leq n$,$S_i$ 都能被$p_i$整除,那么排列 $p$ 被称为 好排列

要判断一个排列是不是 好排列 实在是太容易了,华黎卡可不会喜欢做这么容易的事,所以华黎卡专门为你出了另外一个问题:

给定一个正整数 $n$,你需要构造一个长度为 $n$ 的排列 $p$,使得这个排列是 好排列。你需要判断这样的排列是否存在。另外地,如果这样的排列存在,请输出任意一个满足条件的排列。

【名词解释】一个长度为 $n$ 的排列是一个包含 $n$ 个整数的序列,其中 $1$ 到 $n$ 的每个整数恰好出现一次。例如,$[2,3,1,5,4]$ 是一个排列,而 $[1,2,2]$ 不是($2$ 出现了两次),$[1,3,4]$ 也不是($n=3$ 但出现了 $4$)。

输入描述:

第一行包含一个整数 $t$($1 \leq t \leq 10^4$),表示测试用例的组数。

接下来 $t$ 行,每行包含一个整数 $n$($1 \leq n \leq 5 \times 10^5$),表示你需要构造的排列的长度。

数据保证所有测试用例中 $n$ 的总和不超过 $10^6$。

输出描述:

对于每组测试数据,输出一个字符串,表示能否构造出这样的排列。如果能,输出 $\mathtt{YES}$,否则输出 $\mathtt{NO}$。

如果能构造出这样的排列,请在第二行输出任意一个满足条件的排列。

请注意,答案的输出区分大小写。

示例1

输入

3
1
3
4

输出

YES
1
YES
2 1 3
YES
3 1 4 2

 

解题思路

  傻逼构造题,整场比赛就这题做不出来,打表都找不出规律,评价是糖完了。

  这题就是要打表才能做的,除非你注意力十分惊人,我直接给你跪了 orz。打表结果如下:

打表
n=1:
1

n=2:
2 1

n=3:
2 1 3
3 1 2

n=4:
3 1 4 2
4 2 3 1

n=5:
3 1 4 2 5
4 1 5 2 3
4 2 3 1 5
5 1 2 4 3

n=6:
4 1 5 2 6 3
4 2 6 3 5 1
5 1 2 4 6 3
5 1 6 4 2 3
6 2 4 3 5 1

n=7:
4 1 5 2 6 3 7
4 2 6 3 5 1 7
5 1 2 4 6 3 7
5 1 6 2 7 3 4
5 1 6 4 2 3 7
6 2 4 3 5 1 7
7 1 2 5 3 6 4

n=8:
5 1 6 2 7 3 8 4
7 1 2 5 3 6 8 4
8 2 5 3 6 4 7 1
8 4 2 7 3 1 5 6
8 4 2 7 3 6 5 1
8 4 3 5 1 7 2 6
8 4 6 3 7 2 5 1

n=9:
5 1 6 2 7 3 8 4 9
6 1 7 2 8 3 9 4 5
6 2 1 9 3 7 4 8 5
6 3 9 2 1 7 4 8 5
7 1 2 5 3 6 8 4 9
7 1 4 6 9 3 2 8 5
7 1 8 2 6 3 9 4 5
7 1 8 2 9 3 6 4 5
8 1 9 2 4 6 5 7 3
8 1 9 3 7 2 6 4 5
8 1 9 6 4 2 5 7 3
8 1 9 6 4 7 5 2 3
8 2 5 3 6 4 7 1 9
8 4 2 7 3 1 5 6 9
8 4 2 7 3 6 5 1 9
8 4 3 5 1 7 2 6 9
8 4 6 3 7 2 5 1 9
8 4 6 9 1 2 5 7 3
8 4 6 9 1 7 5 2 3
8 4 6 9 3 5 7 2 1
9 1 2 4 8 6 5 7 3
9 1 2 6 3 7 4 8 5
9 3 4 8 6 5 7 2 1
9 3 6 2 1 7 4 8 5

n=10:
6 1 7 2 8 3 9 4 10 5
6 2 1 9 3 7 4 8 10 5
6 2 8 4 10 5 7 3 9 1
6 3 9 2 1 7 4 8 10 5
7 1 4 6 9 3 2 8 10 5
7 1 4 6 9 3 10 8 2 5
7 1 8 2 6 3 9 4 10 5
7 1 8 2 9 3 6 4 10 5
7 1 8 4 10 6 9 3 2 5
8 1 9 3 7 2 6 4 10 5
8 2 10 4 3 9 6 7 1 5
8 2 10 4 6 5 7 3 9 1
8 4 2 7 3 6 10 5 9 1
8 4 6 2 10 5 7 3 9 1
8 4 6 3 7 2 10 5 9 1
8 4 6 9 3 10 2 7 1 5
9 1 2 6 3 7 4 8 10 5
9 3 4 8 6 10 2 7 1 5
9 3 6 2 1 7 4 8 10 5
10 2 4 8 3 9 6 7 1 5
10 2 4 8 6 5 7 3 9 1
10 2 6 3 7 4 8 5 9 1

n=11:
6 1 7 2 8 3 9 4 10 5 11
6 2 1 9 3 7 4 8 10 5 11
6 2 8 4 10 5 7 3 9 1 11
6 3 9 2 1 7 4 8 10 5 11
7 1 4 6 9 3 2 8 10 5 11
7 1 4 6 9 3 10 8 2 5 11
7 1 8 2 6 3 9 4 10 5 11
7 1 8 2 9 3 6 4 10 5 11
7 1 8 2 9 3 10 4 11 5 6
7 1 8 4 2 11 3 9 5 10 6
7 1 8 4 10 6 9 3 2 5 11
8 1 9 3 7 2 6 4 10 5 11
8 1 9 3 7 2 10 4 11 5 6
8 2 10 4 3 9 6 7 1 5 11
8 2 10 4 6 5 7 3 9 1 11
8 4 2 7 1 11 3 9 5 10 6
8 4 2 7 3 6 10 5 9 1 11
8 4 6 2 10 5 7 3 9 1 11
8 4 6 3 7 2 10 5 9 1 11
8 4 6 9 3 10 2 7 1 5 11
9 1 2 6 3 7 4 8 10 5 11
9 3 4 8 6 10 2 7 1 5 11
9 3 6 2 1 7 4 8 10 5 11
10 1 11 2 4 7 5 8 6 9 3
10 2 4 8 3 9 6 7 1 5 11
10 2 4 8 6 5 7 3 9 1 11
10 2 6 3 7 4 8 5 9 1 11
11 1 2 7 3 8 4 9 5 10 6
11 1 4 8 6 10 5 9 2 7 3

  然而还是要注意力才能找到其中的规律,tmd 我卡了一个多小时都看不出来,这辈子有了,好似喵。

  注意到每个 $n$ 都有类似的排列形式:$$\begin{array}{|c|l|} \hline n & \text{permutation} \\ \hline 1 & 1 \\ \hline 2 & 2 \, 1 \\ \hline 3 & 2 \, 1 \, 3 \\ \hline 4 & 3 \, 1 \, 4 \, 2 \\ \hline 5 & 3 \, 1 \, 4 \, 2 \, 5 \\ \hline 6 & 4 \, 1 \, 5 \, 2 \, 6 \, 3 \\ \hline 7 & 4 \, 1 \, 5 \, 2 \, 6 \, 3 \, 7 \\ \hline 8 & 5 \, 1 \, 6 \, 2 \, 7 \, 3 \, 8 \, 4 \\ \hline 9 & 5 \, 1 \, 6 \, 2 \, 7 \, 3 \, 8 \, 4 \, 9 \\ \hline 10 & 6 \, 1 \, 7 \, 2 \, 8 \, 3 \, 9 \, 4 \, 10 \, 5 \\ \hline 11 & 6 \, 1 \, 7 \, 2 \, 8 \, 3 \, 9 \, 4 \, 10 \, 5 \, 11 \\ \hline \end{array}$$

  可以总结出排列在奇偶位置上的填数规律(下标从 $1$ 开始),有 $p_i = \begin{cases} \lfloor\frac{n}{2}\rfloor + \frac{i+1}{2}, &i\text{ 是奇数} \\ \frac{i}{2}, &i\text{ 是偶数} \end{cases}$。由此可得 $$S_i = \sum_{j=1}^{i}{p_j} = \begin{cases} \sum\limits_{j=1}^{(i+1)/2}{\left(\lfloor\frac{n}{2}\rfloor + j\right)} + \sum\limits_{j=1}^{(i-1)/2}{j}, &i\text{ 是奇数} \\ \sum\limits_{j=1}^{i/2}{\left(\lfloor\frac{n}{2}\rfloor + j\right)} + \sum\limits_{j=1}^{i/2}{j}, &i\text{ 是偶数} \end{cases} = \begin{cases} \left(\lfloor\frac{n}{2}\rfloor + \frac{i+1}{2}\right)\frac{i+1}{2} , &i\text{ 是奇数} \\ \frac{i}{2}\left(\lfloor\frac{n}{2}\rfloor+\frac{i}{2}+1\right), &i\text{ 是偶数} \end{cases}$$

  可以发现,无论 $i$ 是奇数还是偶数,该构造方案总是满足 $p_i \mid S_i$。因此,对于任意 $n$,我们都能构造出满足条件的排列。

  AC 代码如下,时间复杂度为 $O(n)$:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

void solve() {
    int n;
    cin >> n;
    cout << "YES\n";
    for (int i = 1; i <= n; i++) {
        if (i & 1) cout << n / 2 + (i + 1) / 2 << ' ';
        else cout << i / 2 << ' ';
    }
    cout << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}

 

参考资料

  Whalica Cup (Round 2) 题解:https://uploadfiles.nowcoder.com/files/20260215/374967423_1771149708366/WhalicaCupRound2tutorial.pdf

posted @ 2026-02-16 18:59  onlyblues  阅读(0)  评论(0)    收藏  举报
Web Analytics