题目背景
三角形计数(triangle) 递推
题目描述
把大三角形的每条边n等分,将对应的等分点连接起来(连接线分别平行于三条边),这样一共会有多少三角形呢?编程来解决这个问题。
输入格式
第一行为整数t(≤100),表示测试数据组数;接下来t行,每行一个正整数n(≤500)。
输出格式
对于每个n,输出一个正整数,表示三角形个数。
输入输出样例
输入 #1复制
3 1 2 3
输出 #1复制
1 5 13
说明/提示
n(≤500)
t(≤100)
【题目分析】 这个题目由背景可知是一个递推的题,那么我们需要思考如何递推,我们可以将三角形看成一个边长为n的三角形,那么最小的三角形为边长为1,依次增加。
如上图所示三角形被分为了向上的和向下的三角形
向上的三角形的个数:边长为1:1+2+3+4 边长为2:1+2+3..依次类推
向下的三角形的个数: 边长为1:1+2+3,边长为2:1
大家可以仔细观察整个个数的关系
【代码实现】
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL f[510];
LL t[510];
int main()
{
f[1]=1,f[2]=4;
for(int i=3;i<=500;i++)//往上的三角形
f[i]=f[i-1]+(1+i)*i/2;
t[1]=0,t[2]=1;
for(int i=3;i<=500;i++)//往下的三角形
t[i]=t[i-2]+(i)*(i-1)/2;
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
cout<<f[x]+t[x]<<endl;
}
return 0;
}