求 S = Σᵢ₌₁ᴺ Σⱼ₌₁ⁱ j = Σᵢ₌₁ᴺ i(i+1)/2 = N(N+1)(N+2)/6
即前 N 個三角數之和(四面體數)。
| 方法 | 時間 | 程式碼 |
|---|---|---|
| 雙層迴圈 (原代碼) | O(N²) | N≤200 可接受 |
| 單層迴圈累加三角數 | O(N) | sum += i*(i+1)/2 |
| 閉合公式 | O(1) | N*(N+1)*(N+2)/6 |
#include <stdio.h>
int main() {
int T, N;
scanf("%d", &T);
while (T--) {
scanf("%d", &N);
// 用 long long 防止中間溢位 (N≤200 時 int 足夠,但習慣用長整型)
long long ans = 1LL * N * (N + 1) * (N + 2) / 6;
printf("%lld\n", ans);
}
return 0;
}
N=1: 1*2*3/6 = 1 ✓ N=200: 200*201*202/6 = 1,353,400 ✓
Σ i(i+1)/2 = ½ Σ(i²+i) = ½ [N(N+1)(2N+1)/6 + N(N+1)/2]
= N(N+1)/12 [2N+1 + 3] = N(N+1)(N+2)/6