您的位置:首页 > 其它

ACDream 1067 Triangles

2016-08-13 15:21 239 查看
Triangles

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

Submit Statistic Next Problem

Problem Description

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

Input

多组数据。

每组数据一个N (N ≤ 1000000)。

Output

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

Sample Input

3

4

5

Sample Output

1

0

5

分析:我们可以两种点,一种偶数,一种奇数。

偶数时:

把每一个点分一个点,从1,2,3.。。。。,k,k+1……2k,点A我们假设分在1,那么在区间[2-k-2][k+1-2k],分别分有B,C,由于需要组成锐角三角形,所以我们不能在一个区间分两个点,且不能有点在k上,因为那会和A组成半径。切B-C的距离要比k值小。那么就有S = 0 + 1 + 2 + … + (k - 2) = (k -1) * (k -2) /2 = (N/2 - 1) * (N / 2 - 2) / 2 ,由于有n个点且每个点重复计算三次,s=s*n/3。

奇数时:

同上,k=n/2,,0,1,2,3,4,5……k…k+1…2k。A点在0,B,C区间分为[1-k],[k+1,2k],B-C<=k时满足锐角,S = k + (k- 1) + … + 1 = k * (k +1) /2 = (N/2) * (N / 2 + 1) / 2 ;,——->s=s*n/3;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
//N 为偶数时,     ans = N *  (N/2 - 1) * (N / 2 - 2) / 6;
//N为奇数时,      ans = N * (N/2) * (N / 2 + 1) / 6;
int main()
{
long long n,s;
while(scanf("%lld",&n)!=EOF)
{
if(n<3)
printf("0\n");
if(n%2==0)
s=n*(n/2-1)*(n/2-2)/6;
else
s=n*(n/2)*(n/2+1)/6;
printf("%lld\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: