Luogu P2807 三角形计数

题目背景

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

  作者:xuxing

 

posted @ 2017-08-08 22:14  Hammer_cwz_77  阅读(1002)  评论(1编辑  收藏  举报