Pagini recente » Cod sursa (job #997098) | Rating asd dds (asd1239) | Cod sursa (job #2067818) | Cod sursa (job #2687841) | Cod sursa (job #1731302)
#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;
}