#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int maxm = 310;
const int mod = 1e9 + 7;
const int inf = 1e9 + 7;
const int dev = 100010;
const double eps = 1e-6;
const double EPS = eps;
const double pi = acos(-1.0);
int n, m;
struct Point {
  int id;
  double x, y;
  Point() {}
  Point(double _x, double _y) {
    x = _x;
    y = _y;
  }
  Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
  double operator^(const Point &b) const { return x * b.y - y * b.x; }
  double operator*(const Point &b) const { return x * b.x + y * b.y; }
} pp[maxn];
struct Line {
  Point a;
  Point b;
  Line() {}
  Line(Point _a, Point _b) {
    a = _a;
    b = _b;
  }
} line[maxn];
Line ll[maxn];
struct Circle {
  double r;
  Point ctr;
  Circle() {}
  Circle(double _r, Point _a) {
    r = _r;
    ctr = _a;
  }
};
double dist(Point a, Point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double Xmult(Point a, Point b, Point c) {
  return ((b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y));
}
int sgn(double x) {
  if (fabs(x) < EPS) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
bool judgelinecross(Line gg, Line ff) {
  int i, j;
  if (dist(gg.a, gg.b) < EPS)
    return false;
  else if (dist(ff.a, ff.b) < EPS)
    return false;
  double gx = Xmult(gg.a, gg.b, ff.a);
  double gy = Xmult(gg.a, gg.b, ff.b);
  if (gx * gy > EPS) return false;
  return true;
}
bool intersect(Line gg, Line ff) {
  return sgn(Xmult(ff.a, ff.b, gg.a)) * sgn(Xmult(ff.a, ff.b, gg.b)) == -1;
}
Point crossing(Line u, Line v) {
  double a1 = u.a.y - u.b.y;
  double b1 = u.b.x - u.a.x;
  double c1 = u.a.x * u.b.y - u.b.x * u.a.y;
  double a2 = v.a.y - v.b.y;
  double b2 = v.b.x - v.a.x;
  double c2 = v.a.x * v.b.y - v.b.x * v.a.y;
  double ansx = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
  double ansy = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
  return Point(ansx, ansy);
}
bool inter(Line l1, Line l2) {
  return max(l1.a.x, l1.b.x) >= min(l2.a.x, l2.b.x) &&
         max(l2.a.x, l2.b.x) >= min(l1.a.x, l1.b.x) &&
         max(l1.a.y, l1.b.y) >= min(l2.a.y, l2.b.y) &&
         max(l2.a.y, l2.b.y) >= min(l1.a.y, l1.b.y) &&
         sgn((l2.a - l1.a) ^ (l1.b - l1.a)) *
                 sgn((l2.b - l1.a) ^ (l1.b - l1.a)) <=
             0 &&
         sgn((l1.a - l2.a) ^ (l2.b - l2.a)) *
                 sgn((l1.b - l2.a) ^ (l2.b - l2.a)) <=
             0;
}
Point NearestPointToLineSeg(Point P, Line L) {
  Point result;
  double t = ((P - L.a) * (L.b - L.a)) / ((L.b - L.a) * (L.b - L.a));
  if (t >= 0 && t <= 1) {
    result.x = L.a.x + (L.b.x - L.a.x) * t;
    result.y = L.a.y + (L.b.y - L.a.y) * t;
  } else {
    if (dist(P, L.a) < dist(P, L.b))
      result = L.a;
    else
      result = L.b;
  }
  return result;
}
double dist_Point_Line(Point P, Line L) {
  Point gg = NearestPointToLineSeg(P, L);
  return dist(P, gg);
}
int main() {
  int i, j;
  while (scanf("%d", &n) != EOF) {
    for (i = 0; i <= n; i++) {
      scanf("%lf%lf", &pp[i].x, &pp[i].y);
    }
    pp[n + 1] = pp[1];
    double mi = 1e16, mx = 0;
    for (i = 1; i <= n; i++) {
      double temp1 = dist_Point_Line(pp[0], Line(pp[i], pp[i + 1]));
      double temp2 = dist(pp[0], pp[i]);
      mi = min(mi, temp1);
      mx = max(mx, temp2);
    }
    double ans = (mx * mx - mi * mi) * pi;
    printf("%.10f\n", ans);
  }
}
