1 条题解
-
0
题目题解
题意分析
题目要求我们构造一个长度为 的严格递增序列
,
使得对于任意 ,满足:即每个位置的“元素值对下标取模”的结果两两不同。
思路推导
第一步:分析取模结果的范围
对于第 个位置, 的结果只能是 中的某一个数。
第二步:利用“所有结果互不相同”的条件
- 当 时:(唯一结果)。
- 当 时: 可以是 或 。
但 已经被 占用,所以必须取 。 - 当 时: 可以是 。
但 和 已经被占用,所以必须取 。 - 依此类推,我们可以得到:
即每个 必须满足:
第三步:转化为方程
由同余关系, 可以写成:
其中 是非负整数。
第四步:增加递增和范围限制
- 序列严格递增:。
- 题目要求 。
- 同时 (因为 ,若 则 ,但此时 也成立,不过 可能已经占用该值,需要进一步检查)。
为了简单且可行,我们可以取 ,即:
这样:
- ,满足条件。
- 序列为 ,严格递增。
- 当 时,,满足范围限制。
第五步:验证可行性
- 所有 ,互不相同(因为 互不相同)。
- 序列递增且值在 到 之间。
- 构造简单,直接输出 即可。
算法步骤
- 读入 组测试数据。
- 对于每组数据,读入 。
- 输出 个数:。
时间复杂度
每组数据 ,总复杂度 ,非常高效。
参考代码
#include<bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cout << 2 * i - 1 << ' '; } cout << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) solve(); return 0; }
总结
本题的核心是通过分析取模结果互不相同的约束,推出每个 必须满足 ,然后取最简单的解 ,即可在给定范围内构造出合法序列。
- 1
信息
- ID
- 6593
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者