Cod sursa(job #1731302)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 18 iulie 2016 17:27:20
Problema Patrate 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define MOD 8192
using namespace std;
 
int N,Sol,sign;
long long SX;
float val=(sqrt(5.0)-1)/2,P;
char ch=' ';
struct tab
{
    int x,y;
}v[1001];
struct Hash
{
    int x1,y1,x2,y2;
	float p;
}C;
void Read(int &nr)
{
	nr=0;
	while(ch==' '||ch=='\n')
		scanf("%c",&ch);
	sign=0;
	if(ch=='-')
		sign=1,scanf("%c",&ch);
	while(ch>='0'&&ch<='9')
	{
		nr=nr*10+ch-'0';
		if(scanf("%c",&ch)==EOF)
			break;
	}
	if(ch=='.')
	{
		scanf("%c",&ch);
		while(ch>='0'&&ch<='9')
		{
			nr=nr*10+ch-'0';
			if(scanf("%c",&ch)==EOF)
				break;
		}
	}
	if(sign==1)
		nr=-nr;
	nr*=10;
}
int Calc(int a,int b)
{
	float R=(a+0.0f)/(b+0.0f)*10000;
	return R;
}
int f(float x)
{
    float fr=val*x;
    int I=val*x;
    fr=MOD*(fr-I);
    return abs(fr);
}
int L(Hash X)
{
	SX=1LL*(X.x1-X.x2)*(X.x1-X.x2)+1LL*(X.y1-X.y2)*(X.y1-X.y2);
	return sqrt(0.0+SX);
}
vector <Hash>H[MOD];
void Add(int i,int j)
{
    int S=f((0.0f+v[i].x-v[j].x)/(0.0f+v[i].y-v[j].y));
    C.p=(0.0f+v[i].x-v[j].x)/(0.0f+v[i].y-v[j].y);
    C.x1=v[i].x;
    C.x2=v[j].x;
    C.y1=v[i].y;
    C.y2=v[j].y;
    H[S].push_back(C);
}
bool Test(Hash X,Hash Y)
{
    if((X.x1+X.x2)/2==(Y.x1+Y.x2)/2&&(X.y1+X.y2)/2==(Y.y1+Y.y2)/2)
		if(L(X)==L(Y))
        return true;
    return false;
}
bool Search(Hash X)
{
    int S=f(1/X.p);
    for(int i=0;i<H[S].size();i++)
	{
		P=H[S][i].p*X.p;
        if(P<=-0.99999&&P>=-1.00001)
            if(Test(H[S][i],X))
                return true;
	}
    return false;
}
int main()
{
    freopen("patrate3.in","r",stdin);
    freopen("patrate3.out","w",stdout);
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
		Read(v[i].x),Read(v[i].y);
    for(int i=1;i<=N;i++)
        for(int j=i+1;j<=N;j++)
            Add(i,j);
    for(int i=1;i<=MOD;i++)
        for(int j=0;j<H[i].size();j++)
            if(Search(H[i][j]))
                Sol++;
    printf("%d",Sol/2);
    return 0;
}