三角形

源代码:

#include<cstdio>
#include<map>
#define LL long long
#define INF 1000000000 using namespace std; map <double,LL> i; //这个STL差不多就是一个反类型数组。 double f[100001]; LL n,Num(0); LL C(LL N,LL M) //排列组合。 { if (N<M) return 0; LL Sum=1; for (LL a=N;a>=N-M+1;a--) Sum*=a; for (LL a=1;a<=M;a++) Sum/=a; return Sum; } int main() { scanf("%lld",&n); //%lld这种东西我不想再见到它。 for (LL a=1;a<=n;a++) { LL A,B,C; //还有LL,you,too。 scanf("%lld%lld%lld",&A,&B,&C); if (!B) i[-INF]++; //i[中]的数(double)表示斜率,i[]存储的数表示斜率相同的边的条数。 else { double T=(double(A)/B)*0.01; //处理精度误差。 if (!i[T]) f[++Num]=T; //不同直线的斜率种类。 i[T]++; } } if (i[-INF]) //特判处理。 f[++Num]=-INF; LL Ans=C(n,3); for (LL a=1;a<=Num;a++) //处理不符合情况的方案。 { LL T=i[f[a]]; Ans-=C(T,3); //三边之重。 Ans-=C(T,2)*(n-T); //两边之重。 } printf("%lld",Ans); return 0; }
posted @ 2016-10-25 16:35  前前前世。  阅读(188)  评论(0编辑  收藏  举报