/* 求出所有可能的向量V(x,y)使一个点集通过V移动后和新的点集合并,得到给定的点集 直接枚举1和其他点组成的向量即可 因为不管怎么平移,1肯定要有个对应的点,所以合法向量就从这里找即可 注意:得到的向量统一转换成x>0的向量,然后再*2就是答案 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define N 2005 struct point { int x,y; }p[N]; int n,ans; point V; map<pair<int,int> ,int>mp; set<pair<int,int> >s; int check(){ for(int i=1;i<=n;i++){ if(mp[make_pair(p[i].x+V.x,p[i].y+V.y)]==0 && mp[make_pair(p[i].x-V.x,p[i].y-V.y)]==0) return 0; } return 1; } int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d%d",&p[i].x,&p[i].y); mp[make_pair(p[i].x,p[i].y)]=1; } for(int i=2;i<=n;i++){ V.x=p[i].x-p[1].x; V.y=p[i].y-p[1].y; if(V.x<0)V.x*=-1,V.y*=-1; if(V.x==0)V.y=abs(V.y); if(check()){ s.insert(make_pair(V.x,V.y)); } } cout<<s.size()*2<<'\n'; }