1 条题解

  • 0
    @ 2026-5-19 20:33:09

    A. 崇高序列 详细题解

    题目重述

    农夫约翰有一个整数 xx。他创建了一个长度为 nn 的序列,通过交替整数 xxx-x,以 xx 开头。

    例如,如果 n=5n = 5,序列如下:x, x, x, x, xx,\ -x,\ x,\ -x,\ x

    要求计算序列中所有整数的和。


    问题分析

    序列的规律非常清晰:

    • 11 个数:xx
    • 22 个数:x-x
    • 33 个数:xx
    • 44 个数:x-x
    • ...

    一般地,第 ii 个数(1in1 \le i \le n)为:

    • ii 为奇数时:xx
    • ii 为偶数时:x-x

    数学推导

    设序列的和为 SS

    方法一:逐项分析

    序列中每两项 x+(x)=0x + (-x) = 0 可以配对抵消。

    • 如果 nn 是偶数,则正好有 n2\frac{n}{2}(x,x)(x, -x),总和为:

      $S = \frac{n}{2} \times (x - x) = \frac{n}{2} \times 0 = 0$

    • 如果 nn 是奇数,则有 n12\frac{n-1}{2} 对完整的 (x,x)(x, -x) 和一个单独的 xx(因为以 xx 开头且以 xx 结尾),总和为:

      S=n12×0+x=xS = \frac{n-1}{2} \times 0 + x = x

    方法二:公式化

    更简洁的表达式:

    $S = \begin{cases} 0, & n \text{ 为偶数} \\ x, & n \text{ 为奇数} \end{cases}$

    或者写成:

    S=x×(nmod2)S = x \times (n \bmod 2)

    其中 nmod2n \bmod 2 表示 nn 除以 22 的余数(0011)。


    验证示例

    示例输入

    4
    1 4
    2 5
    3 6
    4 7
    

    计算过程

    1. x=1, n=4x=1,\ n=4(偶数)S=0\rightarrow S = 0
    2. x=2, n=5x=2,\ n=5(奇数)S=2\rightarrow S = 2
    3. x=3, n=6x=3,\ n=6(偶数)S=0\rightarrow S = 0
    4. x=4, n=7x=4,\ n=7(奇数)S=4\rightarrow S = 4

    输出

    0
    2
    0
    4
    

    与示例输出完全一致。


    算法步骤

    1. 读入测试用例个数 tt
    2. 对每个测试用例:
      • 读入 xxnn
      • 如果 nn 是偶数,输出 00
      • 如果 nn 是奇数,输出 xx
    3. 重复直到所有测试用例处理完毕

    复杂度分析

    • 时间复杂度:O(t)O(t),每个测试用例只需常数时间计算
    • 空间复杂度:O(1)O(1),不需要额外存储

    标程代码

    #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;
    }
    

    总结

    本题的核心规律是:序列中 xxx-x 成对出现,每对和为 00。因此:

    • nn 为偶数时,所有项都能配对,总和为 00
    • nn 为奇数时,多出一个 xx,总和为 xx

    这是一个非常基础的数学题,重点在于发现配对规律并写出简洁的判断逻辑。

    • 1

    信息

    ID
    7273
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者