源代碼:#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