题解
数列求和
1 条题解
-
0
解题思路
这个数列是 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