限制: 1 Sec 内存限制: 128 MB
提交: 33 解决: 8
题目描述
已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数。
输入
多组数据,每组数据一个N(N <= 1000000)
输出
对于每组数据,输出不同锐角三角形的个数。
样例输入
3
4
5
样例输出
1
0
5
题解:计算锐角三角形的个数,可以用总的三角形的个数减去直角三角形和钝角三角形的个数即可。
圆的直径为三角形的一边构成的三角形一定是直角三角形。类比,固定直径外一点,那两个点在直径下方(靠近固定点)即为钝角三角形,上方即锐角三角形。
可以这样代数化理解:标记一下圆周上的点,顺时针数为1、2、3……i,逆时针数为1、2、3……j,那么,只要满足i+j<=n/2,就是钝角(直角)三角形。
#include <cstdio> #include <stack> #include <queue> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using namespace std; #define CLR(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define LL long long int main() { LL n; while(~scanf("%lld",&n)) { LL sum=n*(n-1)*(n-2)/6; //总的三角形个数 LL num=n>>1; num=num*(num-1)/2; //直角,钝角三角形个数 sum-=n*num; //总的减去 n 个点可以构成的直角,钝角三角形个数 printf("%lld\n",sum); } return 0; }