华黎卡的排列构造
华黎卡的排列构造
题目描述
华黎卡有一个长度为 $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
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/19620451

浙公网安备 33010602011771号