Cod sursa(job #186158)

Utilizator DorinOltean Dorin Dorin Data 26 aprilie 2008 19:59:05
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
# include <cstdio>
# include <vector>
# include <cstring>
# include <map>
# include <set>
# include <queue>
# include <fstream>

using namespace std;

# define input "trapez.in"
# define output "trapez.out"

# define max 1001
# define abs(a) (a<0?-a:a)

int x,y;
int i,j,n;

struct Punct
{
       int x,y;
}p[max];

vector < pair<int, int > > v;

int cmmdc(int a,int b)
{
    while(b)
    {
            int r = a%b;
            a = b;
            b = r;
    }
    return a;
}

pair<int, int> panta(Punct A, Punct B)
{
    // y2-y1 / x2-x1
    
    int numitor,numarator;
    numitor = B.x-A.x;
    numarator = B.y - A.y;
    if(numitor && numarator)
    x = cmmdc(abs(numitor),abs(numarator));
    else x = 1;
    numitor /= x;
    numarator /= x;
    if(numitor < 0) numitor *= -1,numarator *= -1;
    return make_pair(numitor, numarator);
}


int main()
{
    freopen(input, "r", stdin);
    freopen(output,"w", stdout);
    
    scanf("%d",&n);
    for(i = 1; i<=n;i++)
    {
        scanf("%d %d ",&x,&y); 
        p[i].x = x;
        p[i].y = y;
    }
        
    for(i = 1; i < n; i++)
        for( j = i+1; j <= n; j++)
             v.push_back(panta(p[i],p[j]));
             
    sort(v.begin(),v.end());
    
    int ret = 0;
    
    for(i = 0; i< v.size(); i++)
    {
          int nr = 1;
          while(i+1 < v.size() && v[i] == v[i+1]) i++, nr++;
          
          ret+=((nr-1)*nr)>>1;
    }
    
    printf("%d",ret);
    
    return 0;
}