#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const int inf = (1 << 28) - 1;
struct Point {
  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; }
  void transXY(double B) {
    double tx = x, ty = y;
    x = tx * cos(B) - ty * sin(B);
    y = tx * sin(B) + ty * cos(B);
  }
};
struct Line {
  Point s, e;
  Line() {}
  Line(Point _s, Point _e) {
    s = _s;
    e = _e;
  }
};
double dist(Point a, Point b) { return sqrt((a - b) * (a - b)); }
Point NearestPointToLineSeg(Point P, Line L) {
  Point result;
  double t = ((P - L.s) * (L.e - L.s)) / ((L.e - L.s) * (L.e - L.s));
  if (t >= 0 && t <= 1) {
    result.x = L.s.x + (L.e.x - L.s.x) * t;
    result.y = L.s.y + (L.e.y - L.s.y) * t;
  } else {
    if (dist(P, L.s) < dist(P, L.e))
      result = L.s;
    else
      result = L.e;
  }
  return result;
}
const double PAI = acos(-1);
int main() {
  Point A, tmp, now, sta;
  int n;
  scanf("%d%lf%lf", &n, &A.x, &A.y);
  double Max = -1, Min = inf;
  for (int i = 1; i <= n; ++i) {
    scanf("%lf%lf", &now.x, &now.y);
    if (i > 1)
      Min = min(Min, dist(A, NearestPointToLineSeg(A, Line(tmp, now))));
    else
      sta = now;
    Min = min(Min, dist(A, now));
    Max = max(Max, dist(A, now));
    tmp = now;
  }
  Min = min(Min, dist(A, NearestPointToLineSeg(A, Line(sta, now))));
  printf("%.18lf\n", (PAI * Max * Max) - (PAI * Min * Min));
  return 0;
}
