UVA 11401 Triangle Counting
- 链接:UVA 11401
- 题意:给出一个正整数n,问取三个不相同的不大于n的正整数能组成多少不同的三角形?
- 思路:分奇偶,找规律,写公式,整合一下。
例如:
n=7时
sum+=1*(n-2)-1;
sum+=2*(n-3)-(1+2);
sum+=2*(n-4)-(1+2);
sum+=1*(n-5)-1;n=8时
sum+=1*(n-2)-1;
sum+=2*(n-3)-(1+2);
sum+=3*(n-4)-(1+2+3);
sum+=2*(n-5)-(1+2);
sum+=1*(n-6)-1;
由此可以将最上和最下两式为一组进行求和比较方便。
下面是完整代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <algorithm>
#include <map>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <utility>
#include <functional>
#include <sstream>
#include <list>
#include <complex>
#include <ctime>
using namespace std;
#define ll long long
#define ull unsigned long long
const int MAXN=100005;
const int INF=987654323;
const int MOD=1e9+7;
ll sum;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll n;
cin>>n;
while(n>=3){
sum=0;
if(n%2){
ll t=(n-3)/2;
for(ll i=1;i<=t;i++)
sum+=i*(i+1);
sum=-sum;
sum+=n*t*(t+1)/2;
}
else{
ll t=(n-4)/2;
for(ll i=1;i<=t;i++)
sum+=i*(i+1);
sum=-sum;
sum+=n*t*(t+1)/2;
t++;
sum+=(n/2)*t;
sum-=t*(t+1)/2;
}
cout<<sum<<endl;
cin>>n;
}
return 0;
}