Cod sursa(job #261904)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 18 februarie 2009 20:51:15
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair

#define IN  "trapez.in"
#define OUT "trapez.out"
#define N_MAX 1<<10
#define abs(x) ((x)<0?-(x):(x))

typedef vector<int> VI;
typedef pair<ll,ll> pi;
typedef vector<string> VS;

int N;
vector<pi> V(N_MAX);
vector<pi> A;

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&N);
	FOR(i,1,N)
		scanf("%lld%lld\n",&V[i].f,&V[i].s);
}

II void solve()
{
	FOR(i,1,N)
	FOR(j,i+1,N)
	{
		ll a = V[i].f-V[j].f;
		ll b = V[i].s-V[j].s;
		ll m = __gcd(a,b);
		m = max(m,(ll)1);
		if(!a)
			b = 1<<30;
		if(!b)
			a = 1<<30;
		A.pb( mp(a/m,b/m) );
	}
	sort(A.begin(),A.end() );
	
	ll rez(0);
	
	FOR(i,0,(int)A.sz()-1)
	{
		ll nr(1);
		for(;i+1 < (int)A.sz() && A[i+1] == A[i];++i,++nr);
		rez += (nr*(nr-1))>>1;
	}	
	printf("%lld\n",rez);
}

int main()
{
	scan();
	solve();
	return 0;
}