題目背景 三角形計數(triangle) 遞推 題目描述 把大三角形的每條邊n等分,將對應的等分點連接起來(連接線分別平行於三條邊),這樣一共會有多少三角形呢?編程來解決這個問題。 輸入輸出格式 輸入格式: 第一行為整數t(≤100),表示測試數據組數;接下來t行,每行一個正整數n(≤500)。 輸 ...
題目背景
三角形計數(triangle) 遞推
題目描述
把大三角形的每條邊n等分,將對應的等分點連接起來(連接線分別平行於三條邊),這樣一共會有多少三角形呢?編程來解決這個問題。
輸入輸出格式
輸入格式:
第一行為整數t(≤100),表示測試數據組數;接下來t行,每行一個正整數n(≤500)。
輸出格式:
對於每個n,輸出一個正整數,表示三角形個數。
輸入輸出樣例
輸入樣例#1:3 1 2 3輸出樣例#1:
1 5 13
說明
n(≤500)
t(≤100)
題解: 不妨設正 △ABC 的邊長為 n ,首先考慮“頭朝上”的三角形,即平行於水平線的那條邊在其對角頂點下方的三角形。邊長為 1 的“頭朝上”的三角形有 邊長為 2 的“頭朝上”的三角形有 邊長為 n 的“頭朝上”的三角形只有 1 個。
從而得出,“頭朝上”的三角形共有 然後考慮“頭朝下”的三角形,即平行於水平線的那條邊在其對角頂點上方的三角形。
邊長為1的“頭朝下”的三角形有 邊長為2的“頭朝下”的三角形有 邊長為m的“頭朝下”的三角形有 故當 n 為奇數時,“頭朝下”的三角形有 當n為偶數時,“頭朝下”的三角形有 綜上所述,一共產生的三角形的個數為
#include <iostream> #include <cstdio> using namespace std; int t , n , ans[501]; int main() { scanf ( "%d", &t ); for ( int i = 1 ; i <= t ; i++ ) { scanf ( "%d", &n ); if ( n % 2 == 1 ) ans[i] = ( n + 1 ) * ( 2 * n * n + 3 * n - 1 ) / 8; else ans[i] = n * ( n + 2 ) * ( 2 * n + 1 ) / 8; } for ( int i = 1 ; i <= t ; i++ ) cout << ans[i] << endl; return 0; }