UVA_11401

    如果单纯统计合法的三角形,好像不大好办。但如果去统计不合法的,还算好办一些,因为不合法的三角形就相当于找到任意两条边a、b,并且另外一条边c要满足c>=a+b,那么以a、b为边的不合法的三角形一共就有N-(a+b)+1种(这里假设a+b<=N),当然我们不能直接枚举a、b去计算。但观察到实际上a+b的范围是有限的,3到2*N-1而已,那么不妨考虑如果和为i的时候一共有多少对不同的a、b呢?比较容易发现是有(i-1)/2对的,那么最后不合法的三角形数量就变成了sum{(i-1)/2*(N-i+1)}(3<=i<=N)。但是由于数据的原因,O(N)的办法是过不了的,不过我们能够将上面的表达式化简成能O(1)计算的形式。

#include<stdio.h>
#include<string.h>
typedef long long LL;
int N;
LL sum(int n)
{
    return (LL)n * (n + 1) / 2;
}
LL sum2(int n)
{
    return (LL) n * (n + 1) * (2 * n + 1) / 6;
}
int main()
{
    while(scanf("%d", &N), N >= 3)
    {
        LL ans = (LL)N * (N - 1) * (N - 2) / 6;
        int n = N / 2;
        ans -= (N + 3) * sum(n) - 2 * sum2(n) - (LL)(N + 1) * n;
        n = (N - 1) / 2;
        ans -= N * sum(n) - 2 * sum2(n);
        printf("%lld\n", ans);
    }
    return 0;
}

 

 

posted on 2012-10-27 19:26  Staginner  阅读(276)  评论(0编辑  收藏  举报