hpu Triangles(数学)

问题 A: Triangles

时间限制: 1 Sec  内存限制: 128 MB

提交: 33  解决: 8

题目描述

已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数。

输入

多组数据,每组数据一个N(N <= 1000000)

输出

对于每组数据,输出不同锐角三角形的个数。

样例输入

3
4
5

样例输出

1
0
5
题解:因为要求是锐角,所以圆心应该在三角形内部,将点按顺序排序1,2,3.....i...n,逆时针数为1、2、3……j,当n为偶数时,固定一点,必能找到另外一点经过圆心,这样是不符合题意得,我们固定一点,另外两个点在左右两边各一个,且满足i+j<=n/2。

(1)当N为偶数时,用1, 2 .... k ,  k+1,  .... , 2k来标记N个点(2K = N).  固定一个点,  如点A = 点k, 那么2k点是肯定不能选的了,因为 k, 2k组成一条直径。

           所以剩下两个区间 [1, k-1],  [K+1, 2k-1].如果点B, 点C同处一个区间,那么ABC一定是一个钝角三角形,所以B,C一定不可处于同一区间。

           设点B = 点x, x 属于[1, k-2];   点C=点y,y 属于[k+1, 2k-1];

           在这样的情况下,y - x > k 才能使得ABC为锐角三角形  ==> (x, y)的取值有S =  0 + 1 + 2 + ... + (k - 2) = (k -1) * (k -2) /2  = (N/2 - 1) * (N / 2 - 2) / 2 ;

           有N个点,每个三角形被重复计算3次,所以一共有 S * N / 3种;

奇数同理。
所以 N 为偶数时,ans = N *  (N/2 - 1) * (N / 2 - 2) / 6。   N为奇数时,ans = N * (N/2) * (N / 2 + 1) / 6;
#include<cstdio>
#define LL long long
int main()
{
	LL n;
	while(scanf("%lld",&n)!=EOF)
	{
		if((n%2)==0)
		{
			printf("%lld\n",(n/2-2)*(n/2-1)*n/6);
		}
		else
		    printf("%lld\n",(n/2+1)*(n/2)*n/6);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35634181/article/details/56679812
今日推荐