1 条题解
-
0
A. 崇高序列 详细题解
题目重述
农夫约翰有一个整数 。他创建了一个长度为 的序列,通过交替整数 和 ,以 开头。
例如,如果 ,序列如下:。
要求计算序列中所有整数的和。
问题分析
序列的规律非常清晰:
- 第 个数:
- 第 个数:
- 第 个数:
- 第 个数:
- ...
一般地,第 个数()为:
- 当 为奇数时:
- 当 为偶数时:
数学推导
设序列的和为 。
方法一:逐项分析
序列中每两项 可以配对抵消。
-
如果 是偶数,则正好有 对 ,总和为:
$S = \frac{n}{2} \times (x - x) = \frac{n}{2} \times 0 = 0$
-
如果 是奇数,则有 对完整的 和一个单独的 (因为以 开头且以 结尾),总和为:
方法二:公式化
更简洁的表达式:
$S = \begin{cases} 0, & n \text{ 为偶数} \\ x, & n \text{ 为奇数} \end{cases}$
或者写成:
其中 表示 除以 的余数( 或 )。
验证示例
示例输入:
4 1 4 2 5 3 6 4 7计算过程:
- (偶数)
- (奇数)
- (偶数)
- (奇数)
输出:
0 2 0 4与示例输出完全一致。
算法步骤
- 读入测试用例个数
- 对每个测试用例:
- 读入 和
- 如果 是偶数,输出
- 如果 是奇数,输出
- 重复直到所有测试用例处理完毕
复杂度分析
- 时间复杂度:,每个测试用例只需常数时间计算
- 空间复杂度:,不需要额外存储
标程代码
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int x, n; cin >> x >> n; // n 为偶数时和为 0,n 为奇数时和为 x if (n % 2 == 0) { cout << 0 << "\n"; } else { cout << x << "\n"; } } return 0; }简化写法
利用取模运算一行输出:
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int x, n; cin >> x >> n; cout << x * (n % 2) << "\n"; } return 0; }
总结
本题的核心规律是:序列中 和 成对出现,每对和为 。因此:
- 当 为偶数时,所有项都能配对,总和为
- 当 为奇数时,多出一个 ,总和为
这是一个非常基础的数学题,重点在于发现配对规律并写出简洁的判断逻辑。
- 1
信息
- ID
- 7273
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者