#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const double pi = acos(-1.0);
inline int sgn(double x) {
  if (x < -1e-8) return -1;
  return x > 1e-8;
}
struct Vector {
  double x, y;
  inline void read() { scanf("%lf%lf", &x, &y); }
  Vector(double _x = 0, double _y = 0) {
    x = _x;
    y = _y;
  }
  Vector operator+(Vector a) const { return Vector(x + a.x, y + a.y); }
  Vector operator+=(Vector a) { return *this = *this + a; }
  Vector operator-(Vector a) const { return Vector(x - a.x, y - a.y); }
  Vector operator-=(Vector a) { return *this = *this - a; }
  Vector operator*(double p) const { return Vector(x * p, y * p); }
  Vector operator*=(double p) { return *this = *this * p; }
  Vector normal() { return Vector(x / len(), y / len()); }
  bool operator<(const Vector a) const {
    if (x == a.x) return y < a.y;
    return x < a.x;
  }
  bool operator==(const Vector a) const {
    return sgn(x - a.x) == 0 && sgn(y - a.y) == 0;
  }
  double len() const { return sqrt(x * x + y * y); }
  double angle() const { return atan2(y, x); }
} p[N], O;
inline double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }
inline double scalar(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
inline double dist(Vector A, Vector B) {
  return sqrt(1.0 * (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
inline double DistoSegment(Vector A, Vector B, Vector C) {
  if (dist(A, B) < 1e-8) return dist(B, C);
  if (scalar(B - A, C - A) < -1e-8) return dist(A, C);
  if (scalar(A - B, C - B) < -1e-8) return dist(B, C);
  return fabs(cross(B - A, C - A) / dist(A, B));
}
int main() {
  int n;
  scanf("%d", &n);
  O.read();
  for (int i = 0; i < n; ++i) {
    p[i].read();
  }
  double minL = 1e9, maxL = -1e9;
  for (int i = 0; i < n; ++i) {
    minL = min(minL, DistoSegment(p[i], p[(i + 1) % n], O));
    maxL = max(maxL, dist(p[i], O));
  }
  double ans = maxL * maxL - minL * minL;
  ans *= pi;
  printf("%.20f\n", ans);
  return 0;
}
