三角形计数
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;
}