#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
const double inf = 1e20;
const double pi = acos(-1.0);
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
double mysqrt(double x) { return sqrt(max(x, 0.0)); }
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
  bool operator==(const point &b) const {
    return sgn(x - b.x) == 0 && sgn(y - b.x) == 0;
  }
  bool operator<(const point &b) const {
    return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : sgn(x - b.x) < 0;
  }
  point operator+(const point &b) const { return point(x + b.x, y + b.y); }
  point operator-(const point &b) const { return point(x - b.x, y - b.y); }
  point operator*(const double &k) const { return point(x * k, y * k); }
  point operator/(const double &k) const { return point(x / k, y / k); }
  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; }
  double dist(point b) { return hypot(x - b.x, y - b.y); }
  double rad(point a, point b) {
    point p = *this;
    return fabs(atan2(fabs((a - p) ^ (b - p)), (a - p) * (b - p)));
  }
  point trunc(double r) {
    double l = hypot(x, y);
    if (!sgn(l)) return *this;
    r /= l;
    return point(x * r, y * r);
  }
  point rotleft() { return point(-y, x); }
  point rotright() { return point(y, -x); }
  point rotate(point p, double angle) {
    point v = (*this) - p;
    double c = cos(angle), s = sin(angle);
    return point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
  }
  void input() { scanf("%lf%lf", &x, &y); }
};
struct line {
  point s, e;
  line() {}
  line(point s, point e) : s(s), e(e) {}
  bool operator==(const line &v) { return (s == v.s) && (e == v.e); }
  line(point p, double angle) {
    s = p;
    if (sgn(angle - pi / 2) == 0) {
      e = (s + point(0, 1));
    } else {
      e = (s + point(1, tan(angle)));
    }
  }
  line(double a, double b, double c) {
    if (sgn(a) == 0) {
      s = point(0, -c / b);
      e = point(1, -c / b);
    } else if (sgn(b) == 0) {
      s = point(-c / a, 0);
      e = point(-c / a, 1);
    } else {
      s = point(0, -c / b);
      e = point(1, (-c - a) / b);
    }
  }
  void adjust() {
    if (e < s) swap(s, e);
  }
  double length() { return s.dist(e); }
  double dispointtoline(point p) { return fabs((p - s) ^ (e - s)) / length(); }
  double dispointtoseg(point p) {
    if (sgn((p - s) * (e - s)) < 0 || sgn((p - e) * (s - e) < 0))
      return min(p.dist(s), p.dist(e));
    return dispointtoline(p);
  }
};
const int N = 1e5 + 10;
point pp[N];
int main() {
  int n;
  point p;
  scanf("%d", &n);
  p.input();
  double minn = inf, maxx = 0;
  for (int i = 1; i <= n; i++) {
    pp[i].input();
  }
  for (int i = 1; i <= n; i++) {
    maxx = max(p.dist(pp[i]), maxx);
    int j = i == n ? 1 : i + 1;
    line line1 = line(pp[i], pp[j]);
    minn = min(minn, line1.dispointtoseg(p));
  }
  printf("%lf\n", pi * (maxx * maxx - minn * minn));
  return 0;
}
