UVa 11401 11401 - Triangle Counting

来源:互联网 发布:音速启动是什么软件 编辑:程序博客网 时间:2024/04/30 14:20

题目是给一个n,输出1到n中任取三个不重复数能够组成三角形的个数

到现在还是不相信我做出来了。。。

我先用三重循环跑,代码如下:


for(int i=2; i<=n; ++i){            for(int j=i+1; j<=n; ++j){                for(int k=i+j-1; k>j; --k){                    if(i+j>k && k<=n){                        cout << "i = " << i << "\t";                        cout << "j = " << j << "\t";                        cout << "k = " << k << endl;                        count++;                    }                }            }        }

然后运行程序通过输入的n与得到的结果找规律。。。结果就找到规律了尴尬

对应结果如下:

30410+1×1531+1×2673+2×27137+2×382213+3×393422+3×4105034+4×4117050+4×5129570+5×51312595+5*614161 125+6*6

会发现

如果n为偶数

a[i] = a[i-1]+(n-2)*(n-2)/4

如果n位奇数

a[i] = a[i-1]+(n-1)*(n-3)/4

所以如果n为偶数

a[n] = 0+1*1+1*2+2*2+2*3+...+((n-2)/2)*((n-2)/2) = 1*3+2*5+3*7+...+((n-2)/2)*((n-2)/2)

n为奇数

a[n] = 0+1*1+1*2+2*2+2*3+...+((n-1)/2)*((n-3)/2)=1*3+2*5+3*7+...+((n-1)/2)*((n-3)/2)

不妨另b[i] = i*(2*i+1);

则上面两式对应为:

a[n] = sum{ b[i] }+((n-2)/2)*((n-2)/2) 其中(1<= i <=(n-4)/2)

a[n] = sum{ b[i] }其中(1<= i <=(n-3)/2)


所以最后的代码如下:

#include <cstdio>#include <iostream>#include <algorithm>#define MAXN 1000010#define ll long longusing namespace std;ll a[MAXN];ll f(ll n){    return n*(n+1)*(2*n+1)/3+n*(n+1)/2;}int main(void){    ll n;    int ans = 0;    while(cin >> n, n>2){                ll ans = 0;        if(n % 2){            ans = f((n-3)/2);        }        else {            ans = f((n-4)/2)+((n-2)/2)*((n-2)/2);        }                /*        for(int i=2; i<=n; ++i){            for(int j=i+1; j<=n; ++j){                for(int k=i+j-1; k>j; --k){                    if(i+j>k && k<=n){                        cout << "i = " << i << "\t";                        cout << "j = " << j << "\t";                        cout << "k = " << k << endl;                        count++;                    }                }            }        }        */        cout << ans << endl;    }    return 0;}


0 0