Description
Problem G
Triangle Counting
Input: Standard Input
Output: Standard Output
You are given n rods of length 1, 2…, n. You have to pick any 3 of them & build a triangle. How many distinct triangles can you make? Note that, two triangles will be considered different if they have at least 1 pair of arms with different length.
Input
The input for each case will have only a single positive integer n (3<=n<=1000000). The end of input will be indicated by a case with n<3. This case should not be processed.
Output
For each test case, print the number of distinct triangles you can make.
Sample Input Output for Sample Input
5 8 0 | 3 22 |
设c(x)为最大边为x的时候所能组成的三角形个数 设三边长为x,y,z; 则x-y<z<x;
y=0,无解,y=1,无解,y=2, 一种,。。。y=x-1,x-2种,
但是这种情况包括了z=y的情况 也重复了两遍 (z,y)(1,2)(2,1)同一种情况;
因此c(x)=((x-1)(x-2)/2-(x-1)/2)/2
设f[n]为边长为的和,则有递推关系f[n]=f[n-1]+c(x);
#include <iostream>
using namespace std;
const int maxn = 1000010;
long long f[maxn];
void init()
{
f[3] = 0;
for(long long x = 4; x <= 1000000; x++)
{
f[x] = f[x-1] + ((x-1)*(x-2)/2-(x-1)/2)/2;
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)==1)
{
if(n<3)
break;
cout << f[n] << endl;
}
return 0;
}