#include <bits/stdc++.h>
using namespace std;
const int Mod = 998244353;
struct Point {
  double x, y;
  Point() {}
  Point(double x, double y) : x(x), y(y) {}
  Point operator-(const Point &a) const { return Point(x - a.x, y - a.y); }
  Point operator+(const Point &a) const { return Point(x + a.x, y + a.y); }
  Point operator*(const double &a) const { return Point(x * a, y * a); }
  bool operator<(const Point &a) const {
    if (x == a.x) return y < a.y;
    return x < a.x;
  }
};
struct cycle {
  Point p;
  long long r;
  cycle() {}
  cycle(Point p, long long r) : p(p), r(r) {}
};
struct Line {
  Point p;
  Point v;
  double ang;
  Line() {}
  Line(Point p, Point v) : p(p), v(v) { ang = atan2(v.y, v.x); }
  bool operator<(const Line &l) const { return ang < l.ang; }
};
double Cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
double Dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
double dis(Point a) { return sqrt(a.x * a.x + a.y * a.y); }
double dist(Point p, Point a, Point b) {
  Point v1 = b - a, v2 = p - a, v3 = p - b;
  if (Dot(v1, v2) < 0) return dis(v2);
  if (Dot(v1, v3) > 0) return dis(v3);
  return fabs(Cross(a - p, b - p)) / dis(a - b);
}
int convexHull(Point *p, int n, Point *ch) {
  sort(p + 1, p + 1 + n);
  int m = 0;
  for (int i = 1; i <= n; i++) {
    while (m > 1 && Cross(p[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = p[i];
  }
  int k = m;
  for (int i = n - 1; i >= 0; i--) {
    while (m > k && Cross(p[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = p[i];
  }
  if (n > 1) m--;
  return m;
}
bool Onleft(Line l, Point p) { return Cross(l.v, p - l.p) > 0; }
Point GetIner(Line a, Line b) {
  Point u = a.p - b.p;
  double t = Cross(b.v, u) / Cross(a.v, b.v);
  return a.p + a.v * t;
}
int Half(Line *l, int n, Point *poly) {
  sort(l, l + n);
  int fst, lst;
  Point *p = new Point[n];
  Line *q = new Line[n];
  q[fst = lst = 0] = l[0];
  for (int i = 1; i <= n - 1; i++) {
    while (fst < lst && !Onleft(l[i], p[lst - 1])) lst--;
    while (fst < lst && !Onleft(l[i], p[fst])) fst++;
    q[++lst] = l[i];
    if (fabs(Cross(q[lst].v, q[lst - 1].v)) < 1e-7) {
      lst--;
      if (Onleft(q[lst], l[i].p)) q[lst] = l[i];
    }
    if (fst < lst) p[lst - 1] = GetIner(q[lst - 1], q[lst]);
  }
  while (fst < lst && !Onleft(q[fst], p[lst - 1])) lst--;
  if (lst - fst <= 1) return 0;
  p[lst] = GetIner(q[lst], q[fst]);
  int m = 0;
  for (int i = fst; i <= lst; i++) poly[m++] = p[i];
  poly[m] = poly[0];
  return m;
}
int n;
Point o, p[200005], ch[200005];
void solve() {
  double mdis = 20000000000000, madis = 0;
  cin >> n >> o.x >> o.y;
  for (int i = 0; i <= n - 1; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
  for (int i = 0; i <= n - 1; i++) {
    mdis = min(mdis, dis(p[i] - o));
    madis = max(madis, dis(p[i] - o));
    mdis = min(mdis, dist(o, p[i], p[(i + 1) % n]));
  }
  printf("%.16lf\n", madis * madis * acos(-1.0) - mdis * mdis * acos(-1.0));
}
int main() {
  solve();
  return 0;
}
