源代码:#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; }
转载于:https://www.cnblogs.com/Ackermann/p/5997218.html