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