酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

用cpp链接:https://ac.nowcoder.com/acm/contest/113410/D 来源:牛客网 题目描述 小 I 很喜欢完全平方数,同时他也很喜欢递增的序列,所以他丢给了你这样一个题目。 你需要构造一个长度为 𝑛 n 的整数序列 𝑎 1 , 𝑎 2 , … , 𝑎 𝑛 a 1 ​ ,a 2 ​ ,…,a n ​ ,要求序列中任意连续 𝑚 m 个数的和都是完全平方数,并且该序列中的数严格递增,即满足 𝑎 1 < 𝑎 2 < ⋯ < 𝑎 𝑛 a 1 ​ <a 2 ​ <⋯<a n ​ 。 输入描述: 一行两个整数 𝑛 n, 𝑚 m( 1 ≤ 𝑚 ≤ 𝑛 ≤ 1 0 6 1≤m≤n≤10 6 ),意义同题面。 输出描述: 一行 𝑛 n 个整数,表示构造的序列 𝑎 1 , 𝑎 2 , … , 𝑎 𝑛 a 1 ​ ,a 2 ​ ,…,a n ​ 。序列中任意连续 𝑚 m 个数的和都是完全平方数,并且该序列中的数严格递增。 序列中的所有数都应在 [ − 1 0 12 ;

以下是解决该问题的 C++ 代码: ```cpp #include <iostream> #include <vector> using namespace std; // 函数用于构造满足条件的序列 vector<long long> constructSequence(int n, int m) { vector<long long> a(n); // 初始化前 m 个数 for (int i = 0; i < m; ++i) { a[i] = i + 1; } // 从第 m 个数开始构造 for (int i = m; i < n; ++i) { // 计算前 m 个数的和 long long sum = 0; for (int j = i - m + 1; j < i; ++j) { sum += a[j]; } // 找到一个合适的完全平方数 long long targetSum = (i - m + 1) * (i - m + 1); // 计算当前位置的数 a[i] = targetSum - sum; // 保证序列严格递增 if (a[i] <= a[i - 1]) { a[i] = a[i - 1] + 1; } } return a; } int main() { int n, m; cin >> n >> m; // 调用构造函数 vector<long long> result = constructSequence(n, m); // 输出结果 for (int i = 0; i < n; ++i) { if (i > 0) { cout << " "; } cout << result[i]; } cout << endl; return 0; } ``` 代码解释: 1. `constructSequence` 函数: - 首先,我们初始化序列的前 `m` 个数为 `1` 到 `m`。 - 然后,从第 `m` 个数开始,我们计算前 `m` 个数的和,并找到一个合适的完全平方数作为当前连续 `m` 个数的和。 - 通过完全平方数减去前 `m - 1` 个数的和,得到当前位置的数。 - 我们检查当前数是否小于等于前一个数,如果是,则将其设置为前一个数加 `1`,以保证序列严格递增。 2. `main` 函数: - 读取输入的 `n` 和 `m`。 - 调用 `constructSequence` 函数构造序列。 - 输出构造好的序列。 额外注意的逻辑点: 1. 确保完全平方数的选择不会导致序列中的数超出 `[-10^12, 10^12]` 的范围。 2. 在保证序列严格递增时,需要注意更新当前数的逻辑,避免出现错误。 3. 在计算连续 `m` 个数的和时,要注意循环的边界条件,避免越界访问。 [2025-07-10 15:27:57 | AI写代码神器 | 697点数解答]

相关提问