三角形
/* windows下long long 用I64d,不长记性! 斜率没有的时候那个赋值不能用-1,因为有可能有斜率为-1的直线(虽然这题数据里没有。要赋成负无穷 */ #include<cstdio> #include<cstring> #include<iostream> #include<map> #define INF 1e9+5 using namespace std; #define ll long long int n; double b[100010]; map<double,ll>a; ll c(int n,int m) { if(n<m)return 0; ll s=1,i; for(i=n;i>=n-m+1;i--)s*=i; for(i=1;i<=m;i++)s/=i; return s; } int main() { freopen("trokuti.in","r",stdin); freopen("trokuti.out","w",stdout); scanf("%d",&n); ll tot=0,k; for(int i=1;i<=n;i++) { ll A,B,C; scanf("%I64d%I64d%I64d",&A,&B,&C); if(B==0) a[-INF]++;//记录没有斜率的直线 else { double q=(double(A)/B)*1.0;//不是真正的斜率,只是一个比值 if(a[q]==0) b[++tot]=q;//tot记录不同斜率直线的种类 a[q]++;//斜率同为q的直线有多少条 } } if(a[-INF]) b[++tot]=-INF;//如果有无斜率的直线,那么再加一种斜率 ll ans=c(n,3); for(int i=1;i<=tot;i++) { k=a[b[i]]; ans-=c(k,3);//三边平行或重合 ans-=c(k,2)*(n-k);//两边平行或重合 } printf("%I64d",ans); fclose(stdin);fclose(stdout); return 0; }