源代码:
#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;
}