Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Diferente pentru blog/ce-se-intampla-cu-olimpicii intre reviziile 6 si 11 | Diferente pentru templates intre reviziile 10 si 17 | Cod sursa (job #1108049)
#include<fstream>
#include<string>
#include<vector>
using namespace std;
const int MOD = 666013;
const int NM = 1002;
typedef struct lnod{
int x,y;
lnod *next;
}*Nod;
int x1[NM],y1[NM];
string s;
Nod h[MOD];
inline int abs(int x){ return (x<0)?(-x):(x); }
void add(Nod &q,int x,int y){
Nod p = new lnod;
p->x=x;
p->y=y;
p->next=q;
q=p;
}
int main(){
ifstream cin("patrate3.in");
ofstream cout("patrate3.out");
int N,i,j,x,y,l,DX,DY,p1x,p1y,Q,f1,nr=0,semn;
cin>>N; getline(cin,s);
for(i=1;i<=N;++i)
{
getline(cin,s);
x=y=0; l=s.length();
semn=0;
for(j=0;s[j]!=' ';++j)
if(s[j]!='.')
if(s[j]=='-') semn=1;
else x=(x*10)+(s[j]-'0');
x1[i]=x * ((semn==1)?(-1):(1));
semn=0;
for(++j; j<l;++j)
if(s[j]!='.')
if(s[j]=='-') semn=1;
else y=(y*10)+(s[j]-'0');
y1[i]=y * ((semn==1)?(-1):(1));
//cout<<x1[i]<<' '<<y1[i]<<'\n';
add(h[(abs(x+y))%MOD],x,y);
}
for(i=1;i<N;++i)
for(j=i+1;j<=N;++j)
{
DX=x1[i]-x1[j]; DY=y1[i]-y1[j];
p1x=x1[i]+DY; p1y=y1[i]-DX;
Q=(abs(p1x+p1y))%MOD;
f1=0;
for(Nod p=h[Q];p;p=p->next)
if(p->x==p1x && p->y==p1y)
{
f1=1;
}
if(f1){
p1x=x1[j]+DY; p1y=y1[j]-DX;
Q=(abs(p1x+p1y))%MOD;
f1=0;
for(Nod p=h[Q];p;p=p->next)
if(p->x==p1x && p->y==p1y)
{
++nr;
break;
}
}
}
nr>>=1;
cout<<nr<<'\n';
return 0;
}