三角形

/*
    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; 
}

 

posted @ 2016-10-25 14:48  [lemon]  阅读(174)  评论(0编辑  收藏  举报
……