1 条题解
-
0
题目解析
问题重述
给定 和集合 (包含 个不同的整数,每个数在 范围内),需要构造一个长度为 的数组 ,满足:
. 对所有 ,有 . 对所有 ,有
要求输出字典序最大的解,若无解输出 。
条件化简
必要条件
首先考虑 整除 的情况。当 时,,条件变为:
这意味着 不能整除 ,否则 ,违反条件。
结论:对于任意 , 不能整除 。
充分性证明
现在证明这个条件也是充分的。
假设存在一对 违反原条件,即:
令 。则 且 。考虑对 :
- ,所以
- (因为 整除 ?需要验证)
由于 是 的因子,而 整除 ,所以 。因此 。
于是 也违反条件,且此时 。
结论:如果原条件被违反,那么存在一对 且 也违反条件。
因此,只要对所有整除对 ()满足 不整除 ,则原条件对所有 都成立。
核心条件:对所有 ,。
链式结构
考虑一条倍数链:
在这样一条链上,根据核心条件, 不能整除 , 不能整除 ,等等。
由于 都来自同一个有限集合 ,这条链的长度不能超过 。更精确地说,链上每个位置的数必须互不相同,且必须形成一个互不整除的序列。
最长链分析:
考虑从 开始,每次乘以一个质因数的链:
$$1 \to 2 \to 4 \to 8 \to \cdots \to 2^{\lfloor \log_2 n \rfloor} $$这条链的长度是 。由于每一步乘以 (质因数),这实际上是最长可能链——因为要最大化链长,每一步应乘以最小的质数 。
因此,最大链长为 。
存在性条件:为了构造合法序列,必须有足够多的不同数来填充最长链,即:
若 ,则无解,输出 。
构造策略
关键观察
对于位置 ,考虑所有 的倍数链中以 结尾的最长链。这条链的长度决定了 在 中的排名。
定义 = 的质因数个数(计重数)。例如:
那么以 结尾的最长链长度恰好是 。这是因为可以从 开始,每次添加一个质因数到达 。
赋值规则
设 中元素从小到大为 。
为了字典序最大,我们应该把较大的数放在较小的下标上。同时,在倍数链上,数值必须严格递减(否则会违反整除条件)。
因此,对于位置 ,我们赋值为:
这样:
- 越大, 越小(因为要满足链上递减)
- 当 时,,(最大数)
- 当 时,,
- 当 时,,
- 依此类推
正确性验证
. 整除链上的条件:若 ,则 (因为 至少包含一个质因数),所以 ,即 。因此 不整除 (因为 更小)。
. 字典序最大:对于每个位置 , 取到了在不破坏已赋值位置条件下的最大可能值。因为更早的位置(更小的 )已经占用了更大的数。
算法实现
步骤
. 预处理 数组: = 的质因数个数(计重数) . 读入 和 . 若 ,输出 . 否则,对 到 ,输出
时间复杂度
- 预处理 :(埃氏筛)
- 每个测试用例:
- 总复杂度:$O(\sum n \log \log n) \le 3 \times 10^5 \times \log \log 10^5$
完整代码
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 9; int p[N]; // p[i] = 质因数个数(计重数) void solve() { int n, m; cin >> n >> m; vector<int> s(m + 1); for (int i = 1; i <= m; i++) { cin >> s[i]; } // 检查是否有足够的数填充最长链 if (m < __lg(n) + 1) { cout << -1 << '\n'; return; } // 构造序列 for (int i = 1; i <= n; i++) { cout << s[m - p[i]] << ' '; } cout << '\n'; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); // 预处理 p[i]:质因数个数 for (int i = 2; i < N; i++) { if (p[i]) continue; // i 不是质数 for (int j = i; j < N; j += i) { int x = j; while (x % i == 0) { x /= i; p[j]++; } } } int t = 1; cin >> t; while (t--) { solve(); } return 0; }
示例验证
样例
,
预处理 :
构造:
输出: ✅
样例
, ✅
样例
,但 ,无解 → ✅
总结
本题的核心是将复杂的 条件转化为简洁的整除条件:对所有 ,。通过分析倍数链结构和质因数个数,得出构造方案:。这个构造既保证了合法性,又达到了字典序最大。
- 1
信息
- ID
- 6603
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者