







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