Cod sursa(job #491457)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 11 octombrie 2010 13:56:15
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
// infoarena: problema/trapez //
#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
#include <cmath>

#define INF 1<<30
#define MAXN 1010
#define EPS 0.0001
using namespace std;

ifstream in("trapez.in");
ofstream out("trapez.out");

struct PUNCT
{
	int x,y;
};


pair<int,int> ired(int a, int b)
{
	if(b < 0)
		a *= -1, b *= -1;
	
	if(a == 0)
		return make_pair(0, 1);
	if(b == 0)
		return make_pair(1, 0);
	
	int t1=a, t2=b,r;
	r = t1%t2;
	while(r)
	{
		t1 = t2;
		t2 = r;
		r = t1 % t2;
	}
	
	if(a/t2 > 0 && b/t2 < 0 || a/t2 < 0 && b/t2 < 0)
		a*=-1, b*=-1;
	
	return make_pair(a/t2, b/t2);
}

pair<int,int> panta(PUNCT a, PUNCT b)
{
	return ired(a.x - b.x, a.y - b.y);
}

vector<pair<int,int> > c;
vector<pair<int,int> >::iterator it;

PUNCT p[MAXN];
int n,i,j,s,num;
pair<int,int> pc;

int main()
{
	in>>n;
	for(i=1; i<=n; i++)
		in>>p[i].x>>p[i].y;
	
	for(i=1; i<n; i++)
		for(j=i+1; j<=n; j++)
			c.push_back(panta(p[i], p[j]));
		
	sort(c.begin(), c.end());
	
	for(it = c.begin(); it!=c.end(); ++it)
		cout<<it->first<<'/'<<it->second<<'\n';
	
	it = c.begin();
	pc = *it;
	num = 1;
	for(++it; it!=c.end(); ++it)
		if(pc == *it)
			++num;
		else
		{
			pc = *it;
			s += num * (num - 1) / 2;
			num = 1;
		}
	
	out<< s;
	
	return 0;
}