給定長度為 1, 2, …, n 的 n 根桿,任選 3 根組成三角形。兩三角形至少有一邊長不同即視為不同。求不同三角形個數。多測試用例,n ≤ 1,000,000,以 n < 1 結束。
設另兩邊為 y, z(y ≤ z < x),三角不等式要求 y + z > x ⇒ z > x - y。故 z 範圍:x - y < z < x。
x-1 < z < x 無整數解。z = x-1(1 解)。z = x-1, x-2(2 解)。z = x-1, x-2, …, 2(x-2 解)。0+1+2+…+(x-2) = (x-1)(x-2)/2。⌊x/2⌋+1 到 x-1,共 ⌊(x-1)/2⌋ 個。C(x) = [ (x-1)(x-2)/2 - ⌊(x-1)/2⌋ ] / 2。答案 F(n) = Σ_{x=1..n} C(x),遞推式:F(n) = F(n-1) + C(n),F(1)=F(2)=F(3)=0。
#include <stdio.h> long long ans[1000005]; int main() { ans[1] = ans[2] = ans[3] = 0; for (long long x = 4; x <= 1000000; ++x) ans[x] = ans[x-1] + ((x-1)*(x-2)/2 - (x-1)/2) / 2; int n; while (~scanf("%d", &n)) { if (n < 1) break; printf("%lld\n", ans[n]); } return 0; }
ans[n]。long long[1000005] ≈ 8 MB,符合限制。long long 防止中間結果溢出(n=106 時答案約 4×1016)。(x-1)/2 整數除法自動向下取整,等價於 ⌊(x-1)/2⌋,無需分奇偶討論。~scanf 技巧:scanf 返回讀取項數,EOF 為 -1,按位取反為 0 假,結束循環。輸入: 5 8 0 輸出: 3 22