等差数列の和
コード例
C++
using ll = long long;
ll seq_sum(ll a, ll d, ll n) { return (2 * a + (n - 1) * d) * n / 2; }
ll range_sum(ll a, ll b) {
if (a > b) {
swap(a, b);
}
return (a + b) * (b - a + 1) / 2;
}
TypeScript
function seqSum(a: number, d: number, n: number): number {
return ((2 * a + (n - 1) * d) * n) / 2;
}
function rangeSum(a: number, b: number): number {
if (a > b) {
[a, b] = [b, a];
}
return ((a + b) * (b - a + 1)) / 2;
}
アルゴリズム
初項から末項までの総和
例えば 3, 4, 5, 6, 7 の和を求める場合、その和を x だとすると、
となり、足し算の計算は反転しても問題ないので、
とも書ける。
これらの式を辺々足し合わせると下記のとおりとなる。
x = 3 + 4 + 5 + 6 + 7
x = 7 + 6 + 5 + 4 + 3
---------------------------
2x = 10 + 10 + 10 + 10 + 10
よって、 2x = 50, x = 25 で、 3 + 4 + 5 + 6 + 7 = 25 と分かる。
一般に、初項が a、末項が b、 項数が n だとして、初項から末項まで総和 x は下記のとおりとなる。
補足として項数 n は b - a + 1 で求めることができる。
公差が 1 でない場合
x = 3 + 5 + 7 + 9 + 11
x = 11 + 9 + 7 + 5 + 3
---------------------------
2x = 14 + 14 + 14 + 14 + 14
2x = 70
x = 35
35 = (3 + 11) * 5 / 2
上記のように、公差が 1 でなくても総和を求めることができる。
初項、公差、項数から総和を求める場合
初項 a、 項数 n、 公差 d から末項は で求めることができるので、
の式に代入すると、
となる。