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 withn<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 |
解决方案:用加法原理,假设最大边长为x的三角型为c(x)个,那么另外两边的边长为y,z,则y+z<x,得x-z<y<x,假设z=1,无解,z=2,有一个解,,,z=x-1,x-2个解,共有
0+1+2+.....+x-2个解,由加法原理的(x-2)*(x-1)/2个解,然后每个三角形有计算两次,因为y,z可以互换,然后还要排除y=z的三角形,则最小x/2+1到x-1的边长,共有(x-1)/2个
所有总共有c(x)=((x-2)*(x-1)/2-(x-1)/2))/2
code:
#include <iostream>
#include<cstdio>
using namespace std;
const long long mm=1000005;
long long n;
long long res[mm];
void slove(){
res[3]=0;
for(long long nn=4;nn<=mm;nn++)
res[nn]=res[nn-1]+((nn-1)*(nn-2)/2-(nn-1)/2)/2;///递推得出结果
}
int main()
{
slove();
while(~scanf("%lld",&n)){
if(n<3) break;
printf("%lld\n",res[n]);
}
return 0;
}