1 条题解
-
0
题目分析
我们需要构造一个长度为 的排列 ,使得对于每个前缀,定义
$$c_i = \left\lceil \frac{p_1 + p_2 + \dots + p_i}{i} \right\rceil $$则在 中,至少有 个质数。
最大可达 ,要求我们在线性时间内构造出这样的排列。
核心思路
题解和标程都基于一个关键的数学定理:
伯特兰-切比雪夫定理(Bertrand's postulate):
对于任意正整数 ,区间 内至少存在一个质数。
利用这个定理,我们可以找到一个合适的质数 ,然后通过巧妙的构造,使得许多前缀的平均值恰好等于 ,从而产生大量的质数 。
构造方法详解
第一步:选择质数
我们需要选择一个质数 ,使得它在排列中能够产生足够多的 。
观察发现:如果我们让排列的前若干项关于 对称,即
那么前 项的和为
$$p + (p-1) + (p+1) + \dots + (p-k) + (p+k) = (2k+1)p $$因此平均值为 ,所以
$$c_{2k+1} = \left\lceil \frac{(2k+1)p}{2k+1} \right\rceil = p $$也就是说,所有奇数下标的前缀平均值都等于 。
第二步:确定 的范围
为了使对称构造能持续足够长的时间,我们需要 离边界不太近,即 且 。
如果我们取 ,那么需要:
- ,即
- ,即
注意到 $n - \left\lfloor \frac{n}{3} \right\rfloor = \left\lceil \frac{2n}{3} \right\rceil$,因此 应满足
$$\left\lfloor \frac{n}{3} \right\rfloor < p \le \left\lceil \frac{2n}{3} \right\rceil $$第三步:证明 的存在性
由伯特兰-切比雪夫定理,取 ,则存在质数 满足
$$\left\lfloor \frac{n}{3} \right\rfloor < p \le 2\left\lfloor \frac{n}{3} \right\rfloor $$而 $2\left\lfloor \frac{n}{3} \right\rfloor \le \left\lceil \frac{2n}{3} \right\rceil$,因此这样的 一定存在。
第四步:构造排列
选定质数 后,按照以下方式构造排列:
- 先放置
- 然后交替放置 ,只要数值在 范围内
- 最后将剩余未使用的数按任意顺序放在末尾
这样构造的排列中,前 个奇数下标的前缀平均值都等于 ,因此至少有 个 等于 ,即至少有 个质数,满足题目要求(题目要求 个)。
标程实现
标程的实现思路略有不同,在 附近寻找质数,而不是在 到 区间。
#include <bits/stdc++.h> using namespace std; bool isPrime(int x) { if (x <= 1) return false; for (int i = 2; i * i <= x; ++i) { if (x % i == 0) return false; } return true; } vector<int> generateSol(int n, int p) { vector<int> ans; ans.push_back(p); for (int i = 1; i <= n; ++i) { if (p - i > 0) ans.push_back(p - i); if (p + i <= n) ans.push_back(p + i); } return ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n; cin >> n; vector<int> ans; // 从 n/2 开始向两侧寻找质数 for (int x = 0; ; ++x) { int candidate1 = n / 2 - x; if (candidate1 >= 2 && isPrime(candidate1)) { ans = generateSol(n, candidate1); break; } int candidate2 = n / 2 + x; if (candidate2 <= n && isPrime(candidate2)) { ans = generateSol(n, candidate2); break; } } for (int i = 0; i < n; ++i) { cout << ans[i] << " \n"[i == n - 1]; } } return 0; }为什么这样也能工作?
- 质数存在性:在 附近同样存在质数(由伯特兰-切比雪夫定理可得)
- 对称构造:当 时,左右各有约 个整数可用,可以生成更多
- 要求宽松:题目只要求 个质数, 附近的 产生的质数数量远超这个要求
构造过程示例
以 ,(,取 )为例:
- 初始:
- : 加入, 加入 →
- : 无效, 加入 →
- : 无效, 加入 →
最终排列为 ,计算 :
- (质数)
- (质数)
- (质数)
- (质数)
- (质数)
全部 5 个数都是质数,远超 的要求。
时间复杂度分析
- 寻找质数 :从 开始向两侧检查,每次检查 ,由于质数密度高,通常几次就能找到,总复杂度
- 构造排列:
- 总复杂度 每组数据,可以轻松通过 的测试
总结
本题的关键在于:
- 利用伯特兰-切比雪夫定理保证在指定区间存在质数
- 通过对称构造让多个前缀平均值等于该质数
- 标程选择 附近的质数,虽然与题解区间不同,但同样有效且实现更简洁
这种构造方法体现了算法竞赛中常见的"存在性构造"思想:不追求最优解,只要求找到一个满足条件的解,通常需要巧妙的数学观察。
- 1
信息
- ID
- 6218
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者