Triangle Counting
Time Limit: 1000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
![Download as PDF Download as PDF](https://i-blog.csdnimg.cn/blog_migrate/2ea975a8d421ce3226c46b0946fd5932.png)
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 |
Problemsetter: Mohammad Mahmudur Rahman
题意:
求有多少种方法从1,2...n中选出3个不同的数,使得他们能够组成三角形 n <= 1000000
c[x]表示最大边为x的三角形个数,另外两边长为y z,则有 x-y < z < x
则y=1 2 3...x-1 相应的z有0 1 2...(x-2)种选择
但是这里面有y==z的情况(题目要求3个不同的数) 当y从x/2+1开始到x-1。
还有就是这里每个三角形计算了两遍 所以应该除以2
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <set>
using namespace std;
//#define WIN
#ifdef WIN
typedef __int64 LL;
#define iform "%I64d"
#define oform "%I64d\n"
#define oform1 "%I64d"
#else
typedef long long LL;
#define iform "%lld"
#define oform "%lld\n"
#define oform1 "%lld"
#endif
#define S64I(a) scanf(iform, &(a))
#define P64I(a) printf(oform, (a))
#define P64I1(a) printf(oform1, (a))
#define REP(i, n) for(int (i)=0; (i)<n; (i)++)
#define REP1(i, n) for(int (i)=1; (i)<=(n); (i)++)
#define FOR(i, s, t) for(int (i)=(s); (i)<=(t); (i)++)
const int INF = 0x3f3f3f3f;
const double eps = 10e-9;
const double PI = (4.0*atan(1.0));
const int maxn = 1000000 + 20;
LL f[maxn];
int main() {
f[3] = 0;
for(int i=4; i<maxn; i++) {
f[i] = f[i-1] + ((LL)(i-1) * (i-2) / 2 - (i-1) / 2) / 2;
}
int n;
while(scanf("%d", &n) != EOF && n>=3) {
P64I(f[n]);
}
return 0;
}