uva 11401 - Triangle Counting(数论)

来源:互联网 发布:北京 职称评审知乎 编辑:程序博客网 时间:2024/06/05 20:33

题目链接:uva 11401 - Triangle Counting

题目大意:有多少种方法可以从1,2,3...n中选出3个不同的数组成三角形,给出n,求种数。

解题思路:加法原理,设最大边为x的三角形有c(x)个,那么另外两条边长分别为y和z,根据三角形的形式可以的y+z>x,所以z的范围即为xy<z<x
根据这个不等式可以得到每个y值所对应的z值个数,为等差数列,所以

c(x)=(x1)(x2)2x122
然后根据递推:f(n)=i=1nc(i)

代码

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef unsigned long long ll;const int N = 1e6+5;ll f[N];int main () {    int n;    f[3] = 0;    for (ll i = 4; i < N; i++)        f[i] = f[i-1] + ((i-1)*(i-2)/2 - (i-1)/2)/2;    while (scanf("%d", &n) == 1 && n >= 3) {        printf("%llu\n", f[n]);    }    return 0;}
1 0
原创粉丝点击