Problem:三角形計數

zstu_zhoubenshan發表於2021-01-01

三角形計數
Description
快碼佳編四兄弟姐妹來到了明代,這天他們看到一個很有學術風範的老者在地上畫著東西,一打聽,原來是著名的數學家徐光啟。徐光啟在數學方面的最大貢獻當推《幾何原本》(前6卷)翻譯。徐光啟提出了實用的“度數之學“的思想,同時還撰寫了《勾股義》和《測量異同》兩書。他們看到徐先生在地上畫著好多三角形。把大三角形的每條邊n等分,將對應的等分點連線起來(連線線分別平行於三條邊),這樣一共會有多少三角形呢?程式設計來解決這個問題
Input
第一行為整數t(≤100),表示測試資料組數;接下來t行,每行一個正整數n(≤500)。
Output
對於每個n,輸出一個正整數,表示三角形個數
Sample Input
3
1
2
3
Sample Output
1
5
13
這題分別計數頭朝上的三角形個數和頭朝下的三角形個數。將三角形n等份後,最小的三角形邊長計為1。
1.頭朝上:
以n=4為例,邊長i=1的時候,三角形個數s1=1+2+3+4;
i=2,s2=1+2+3;
i=3,s3=1+2;
i=4,s4=1;
由此可以得出si=(n-i+1)(n-i+2)/2;
所以頭朝上的即為i=1到i=n的si求和;
2.頭朝下 :
n=1, s=0;
n=2, s=0+1;
n=3, s=0+1+2;
n=4, s=0+1+(1+2+3);
n=5, s=0+(1+2)+(1+2+3+4);
n=6 ,s=0+1+(1+2+3)+(1+2+3+4+5);
由此可以推出,n為偶數時,f(n)=(1+…+n-i)+f(n-2);
n為奇數時,f(n)=(1+…+n-i)+f(n-2); 累加即可。
程式碼如下:

#include<iostream>
#include<cstdio>
using namespace std;
int f(int n)
{
	if(n%2==0)
	{
		if(n==2) return 1;
		else if(n==4) return 7;
		else if(n>4)  return (n-1)*n/2+f(n-2);
	}
	else 
	{
		if(n==1) return 0;
		else if(n==3) return 3;
		else if(n==5) return 13;
		else if(n>5) return (n-1)*n/2+f(n-2);
	}
}
int main()
{
	int  t,sum1,sum2;
	cin>>t;
	while(t--)
	{
		sum1=0,sum2=0;
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			sum1+=(n-i+1)*(n-i+2)/2;
		}
		sum2=f(n)+sum1;
		cout<<sum2<<endl;
	}
	return 0;
}

相關文章