UVA 11401 Triangle Counting

本文提供了一种解决UVA_11401问题的有效方法,通过计算不合法三角形的数量来间接得出合法三角形的数量。采用数学公式优化计算过程,实现O(1)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

 

 

转载于:https://www.cnblogs.com/staginner/archive/2012/10/27/2742718.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值