ACDream 1067 Triangles

来源:互联网 发布:手机淘宝如何切换账号 编辑:程序博客网 时间:2024/05/01 19:12

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;}
0 0
原创粉丝点击