Problem: A convex polygon consisting of N vertices is given. The coordinates of each vertex are represented counterclockwise by (X1, Y1), (X2, Y2), ……, (XN, YN). No matter what straight line passes through the point P, find the coordinates of the point P so that the areas of the two convex polygons obtained after cutting are equal.

Constraints

* All inputs are integers

* 3 ≤ N ≤ 50

* 0 ≤ | Xi |, | Yi | ≤ 1000000

* The input polygon is a simple convex polygon.

* The output must satisfy max (| X-cX |, | Y-cY |) ≤ 0.0001 when the output coordinates are (X, Y) and the exact solution is (cX, cY).

Input

The input is given in the following format.

> N
> X1 Y1
> X2 Y2
> ……
> XN YN
>

Output

If there is a point that satisfies the condition of the problem statement, the coordinates of that point

> X Y
>

Output in the format of. If the point does not exist, output "NA" on one line.

Examples

Input

4
100 100
0 100
0 0
100 0


Output

50.00000 50.00000


Input

3
100 100
0 100
0 0


Output

NA

Solution (in CPP):

Solution:
#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;

#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef complex<double> P;
typedef pair<P,P> Edge;
typedef long long ll;

const double PI=4*atan(1.0);
const int MAX_SIZE = 10000;

// 内積
double dot(P a, P b) {
  return (a.real() * b.real() + a.imag() * b.imag());
}
// 外積
double cross(P a, P b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
// 点cが直線ab上にあるかないか
int is_point_on_line(P a, P b, P c) {
  return EQ( cross(b-a, c-a), 0.0 );
}
// 2直線の直行判定
int is_orthogonal(P a1, P a2, P b1, P b2) {
  return EQ( dot(a1-a2, b1-b2), 0.0 );
}
// 2直線の平行判定
int is_parallel(P a1, P a2, P b1, P b2) {
  return EQ( cross(a1-a2, b1-b2), 0.0 );
}
// 点a,bを通る直線と点cの間の距離
double distance_l_p(P a, P b, P c) {
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// 点a,bを端点とする線分と点cとの距離
double distance_ls_p(P a, P b, P c) {
  if ( dot(b-a, c-a) < EPS ) return abs(c-a);
  if ( dot(a-b, c-b) < EPS ) return abs(c-b);
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// 点が多角形の中に存在するかどうか
bool isInPolygon(vector<P> &points,P s){
  if(points.size()==1)return false;
  vector<P> v;
  for(int i=0;i<(int)points.size();i++)v.push_back(points[i]-s);
  int sign=0;
  for(int i=1;i<=(int)v.size();i++){
    int prv=(i-1+v.size())%v.size();
    int cur=i%v.size();
    double c=cross(v[prv],v[cur]);
    if(EQ(c,0))continue;
    else if(sign==0){
      if(c>0)sign=1;
      else sign=-1;
    }
    else{
      if(sign==-1&&c>0)return false;
      else if(sign==1&&c<0)return false;
    }
  }
  return true;
}
struct Rec{
  vector<P> p;
};
// a1,a2を端点とする線分とb1,b2を端点とする線分の交差判定
int is_intersected_ls(P a1, P a2, P b1, P b2) {
  // 線分が平行な場合は重なっていないことにする
  if(abs(cross(a2-a1,b2-b1)) < EPS){
    return 0;
  }
  return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
    ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}
// aとbの矩形が接しているかどうか(どちらかがどちからを含んでいるものもふくむ
bool isTouchRectangle(Rec &a,Rec &b){
  // aの各頂点がbの中に存在しているかチェック
  for(int i=0;i<4;i++)if(isInPolygon(b.p,a.p[i]))return true;
  // 逆
  for(int i=0;i<4;i++)if(isInPolygon(a.p,b.p[i]))return true;
  // 各辺が他方のどれかの辺と接しているか
  for(int i=0;i<4;i++){
    int curi=i;
    int prvi=(i-1+4)%4;
    for(int j=0;j<4;j++){
      int curj=j;
      int prvj=(j-1+4)%4;
      if(is_intersected_ls(a.p[curi],a.p[prvi],b.p[curj],b.p[prvj]))return true;
    }
  }
  return false;
}
// a1,a2を端点とする線分とb1,b2を端点とする線分の交点計算
P intersection_ls(P a1, P a2, P b1, P b2) {
  P b = b2-b1;
  double d1 = abs(cross(b, a1-b1));
  double d2 = abs(cross(b, a2-b1));
  double t = d1 / (d1 + d2);

  return a1 + (a2-a1) * t;
}
// a1,a2を通る直線とb1,b2を通る直線の交差判定
int is_intersected_l(P a1, P a2, P b1, P b2) {
  return !EQ( cross(a1-a2, b1-b2), 0.0 );
}
// a1,a2を通る直線とb1,b2を通る直線の交点計算
P intersection_l(P a1, P a2, P b1, P b2) {
  P a = a2 - a1; P b = b2 - b1;
  return a1 + a * cross(b, b1-a1) / cross(b, a);
}
// 単位ベクトルを求める
P normalVector(P p){
  return p/abs(p);
}
// 法線ベクトルを求める
P unitVector(P a){
  return P(-a.imag(),a.real());
}
// 単位法線ベクトルを求める
P unitNormalVector(P tmp){
  P e=P(-tmp.imag(),tmp.real());
  e/=abs(e);
  return e;
}
// 座標の回転(座標pにある点を,半時計回りにa(ラジアン)回転)
P roundPoint(P p,double a){
  return P(cos(a)*p.real()-sin(a)*p.imag(),sin(a)*p.real()+cos(a)*p.imag());
}
// 多角形の面積公式
double calcPolygonArea(vector<P> p){
  double sum=0;
  for(int i = 0; i < (int)p.size(); i++)
    sum+=cross(p[i],p[(i+1)%(p.size())]);
  return abs(sum/2);
}

P ps[101];
P ps2[101];
int main(){
  int N;
  cin>>N;
  double avgx=0,avgy=0;
  for(int i=0;i<N;i++){
    double x,y;
    cin>>x>>y;
    avgx+=x;
    avgy+=y;
    ps[i]=P(x,y);
  }
  if(N%2==1){
    cout<<"NA"<<endl;
    return 0;
  }
  avgx/=N;avgy/=N;
  for(int i=0;i<N;i++){
    double d1=abs(ps[(i+1)%N]-ps[i]);
    double d2=abs(ps[(i+N/2+1)%N]-ps[(i+N/2)%N]);
    // P p1=(ps[(i+1)%N]-ps[i]);
    // P p2=(ps[(i+N/2+1)%N]-ps[(i+N/2)%N]);
    //cout<<d1<<" "<<d2<<endl;
    //cout<<p1<<" "<<p2<<endl;
    //if(!EQV(p1,p2)){
    if(!EQ(d1,d2)){
      cout<<"NA"<<endl;
      return 0;
    }
  }
  P avgp=P(avgx,avgy);
  printf("%.10f %.10f\n",avgp.real(),avgp.imag());
  // for(int i=0;i<N;i++)ps[i]-=avgp;
  // for(int i=0;i<N;i++)ps2[i]=roundPoint(ps[i],PI);
  // bool ok=false;
  // for(int i=0;i<N;i++){
  //   for(int j=0;j<N;j++){
  //     if(EQV(ps[i],ps2[j])){
  // 	for(int k=0;k<N;k++){
  // 	  int a=(k+j)%N;
  // 	  int b=(k+i)%N;
  // 	  if(!EQV(ps[a],ps2[b])){
  // 	    cout<<"NA"<<endl;
  // 	    return 0;
  // 	  }
  // 	}
  // 	ok=true;
  // 	break;
  //     }
  //   }
  //   if(ok)break;
  // }
  // if(ok)printf("%.10f %.10f\n",avgp.real(),avgp.imag());
  // else cout<<"NA"<<endl;
    
  return 0;
}