Cod sursa(job #132682)

Utilizator vlad_popaVlad Popa vlad_popa Data 6 februarie 2008 13:24:11
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cassert>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

#define NMAX 1024
#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define f first
#define s second

int N;
int X[NMAX], Y[NMAX];
vector < pair<int, int> > panta;

void read ()
{
    scanf ("%d\n", &N);
    
    int i;
    for (i = 1; i <= N; ++ i)
        scanf ("%d %d\n", X + i, Y + i);
}

inline int cmmdc(int a, int b)
{
	int c;

	while (b)
	{
		c = a % b;
		a = b;
		b = c;
	}

	return a;
}

void Get_Panta ()
{
    int i, j, x, y, d;
    
    for (i = 1; i <= N; ++ i)
        for (j = i + 1; j <= N; ++ j)
        {
            x = X[i] - X[j];
            y = Y[i] - Y[j];
            d = cmmdc (x, y);
            
            panta.pb(mp (x/d, y/d));
        }
}

int Get_Sol ()
{
    int i, sz, x = 2, y = 4, cnt, sol = 0;

    for (i = 0, sz = panta.size(); i < sz; ++ i)
        if (x != panta[i].f || y != panta[i].s)
        {
            sol += (cnt * (cnt-1)) >> 1;
            cnt = 1;
            x = panta[i].f,  y = panta[i].s;
        }    
        else
            ++ cnt;
    return sol;
}

void solve ()
{
    Get_Panta ();
    printf ("%d\n", Get_Sol ());
}

int
 main ()
{
    freopen ("trapez.in", "rt", stdin);
    freopen ("trapez.out", "wt", stdout);
    
    read ();
    solve ();
    
    return 0;
}