#include <bits/stdc++.h>
struct Point {
  double x, y;
};
static Point ZERO = {0, 0};
static Point RIGHT_TOP_LIMIT = {1000000, 1000000};
static Point LEFT_BOTTOM_LIMIT = {-1000000, -1000000};
double distance(Point* a, Point* b) {
  return std::sqrt(std::pow(a->x - b->x, 2) + std::pow(a->y - b->y, 2));
}
Point* sum(Point* a, Point* b) {
  Point* x = new Point();
  *x = Point{a->x + b->x, a->y + b->y};
  return x;
}
Point* sub(Point* a, Point* b) {
  Point* x = new Point();
  *x = Point{a->x - b->x, a->y - b->y};
  return x;
}
double dot(Point* A, Point* B, Point* C) {
  Point* AB = new Point();
  Point* BC = new Point();
  AB->x = B->x - A->x;
  AB->y = B->y - A->y;
  BC->x = C->x - B->x;
  BC->y = C->y - B->y;
  double dot = AB->x * BC->x + AB->y * BC->y;
  delete AB;
  delete BC;
  return dot;
}
double cross(Point* A, Point* B, Point* C) {
  Point* AB = new Point();
  Point* AC = new Point();
  AB->x = B->x - A->x;
  AB->y = B->y - A->y;
  AC->x = C->x - A->x;
  AC->y = C->y - A->y;
  double cross = AB->x * AC->y - AB->y * AC->x;
  delete AB;
  delete AC;
  return cross;
}
double line_point_distance(Point* A, Point* B, Point* C, bool isSegment) {
  double dist = cross(A, B, C) / distance(A, B);
  if (isSegment) {
    double dot1 = dot(A, B, C);
    if (dot1 > 0) return distance(B, C);
    double dot2 = dot(B, A, C);
    if (dot2 > 0) return distance(A, C);
  }
  return std::abs(dist);
}
std::vector<Point*> convexHull(std::vector<Point*> points, Point* leftmost) {
  Point* start = leftmost;
  Point* p = leftmost;
  std::vector<Point*> res;
  do {
    Point* n = nullptr;
    for (Point* i : points) {
      if (i == p) continue;
      if (!n) n = i;
      Point* temp1 = sub(i, p);
      Point* temp2 = sub(n, p);
      double x = cross(&ZERO, temp1, temp2);
      delete temp1;
      delete temp2;
      if (x < 0) {
        n = i;
      }
    }
    res.push_back(n);
    p = n;
  } while (start != p);
  return res;
}
int main() {
  int32_t n;
  double x, y;
  scanf("%u%lf%lf", &n, &x, &y);
  Point* center = new Point();
  *center = {x, y};
  std::vector<Point*> all_points;
  for (uint32_t i = 0; i < n; i++) {
    scanf("%lf%lf", &x, &y);
    Point* v = new Point();
    *v = Point{x, y};
    all_points.push_back(v);
  }
  double d_short = distance(&RIGHT_TOP_LIMIT, &LEFT_BOTTOM_LIMIT);
  double d_far = 0;
  Point* prev = all_points.back();
  for (Point* p : all_points) {
    double d = line_point_distance(prev, p, center, true);
    if (d < d_short) d_short = d;
    d = distance(center, p);
    if (d > d_far) d_far = d;
    prev = p;
  }
  double big = 3.14159265358979323846264338327950288 * std::pow(d_far, 2);
  double small = 3.14159265358979323846264338327950288 * std::pow(d_short, 2);
  printf("%.18lf\n", big - small);
  delete center;
  for (Point* p : all_points) {
    delete p;
  }
  return 0;
}
