【UVA-11401】解题报告(数学,求和公式)

原始题目

题目大意

有长度分别为\(1,2,3,4 \cdots n\) 的木杆各一根,问共可以组成多少个三角形。

解题思路

  • \(f[x]\) 表示以\(x\)为最长边的三角形的个数。
  • 设另两条边为\(y,z\),易知\(y+z>x\),所以\(x-z<y<x\),当\(z>=2\)时有解。
  • 解的情况总数为\(\sum {i=2}^{x-1} { \frac {(x-2)(x-1)}{2}}\)。但里面包括 y,z 互换以及 y=z 的情况

故还需要减去等腰三角形数再除以 2

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <algorithm>
#include <vector>
#include <string>
#include <sstream>
#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,a,n) for(int i=n-a;i>=a;--i)
#define se second
#define fi first
#define eps 1e-8
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e6+5;
const int maxl=26;
const int maxm=1e6+5;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int> pii;
ll n,m;
ll f[maxn],sum[maxn];
void solve(){
f[0]=f[1]=f[2]=0;
for(ll i=3;i<=maxn-1;i++){
f[i]=(i-2)*(i-1)/2;
f[i]=(f[i]-(i-i/2-1))/2;
sum[i]=sum[i-1]+f[i];
}
}
int main(){
ios::sync_with_stdio(false);
solve();
while(cin>>n&&n>=3){
cout<<sum[n]<<endl;
}
}

收获与反思

  • 学习推导公式