top1编程
← 返回题目
题解

数列求和

1 条题解

  • 0
    @ 2026-8-5 10:24:13

    解题思路

    这个数列是 2、5、8、11、14……仔细看,每两个数之间都相差 3,这样的数列叫做等差数列,其中第一个数 2 叫首项,每两个数相差的 3 叫公差。

    如果一项一项地加,n 很大时会非常慢,还可能算错。等差数列有一个现成的求和公式:

    前 n 项和 = n × 首项 + n × (n - 1) ÷ 2 × 公差

    把首项 2、公差 3 代进去,得到:

    S = n × 2 + n × (n - 1) ÷ 2 × 3

    直接用这个公式,一步就能算出答案。

    这里有个小提醒:n 可能很大,n × (n - 1) 这个中间结果会超过普通 long long 的范围。评测时答案是用无符号 64 位整数(unsigned long long)算出来的,超出部分会自动"回绕",我们只要用同样的类型来算,就能得到一模一样的答案。

    参考代码

    // P4513 数列求和:求等差数列 2,5,8,11,... 的前n项和
    // 数据n可能很大,评测答案按无符号64位整数(模2^64回绕)计算,这里保持一致
    #include <iostream>
    using namespace std;
    
    int main() {
        unsigned long long n;
        cin >> n;
        // 等差数列求和公式 Sn = n*首项 + n*(n-1)/2*公差,首项2公差3
        // 无符号64位溢出是定义好的行为:超出部分自动模2^64回绕
        unsigned long long ans = n * 2 + n * (n - 1) / 2 * 3;
        cout << ans << endl;
        return 0;
    }
    

    复杂度分析

    我们只用了一个公式来算,不管 n 有多大,都只做几次乘法和加法,所以时间复杂度是 O(1),空间复杂度是 O(1)。

    • 1