#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
struct Point {
  double x, y;
  Point() { x = y = 0; }
  Point(double a, double b) {
    x = a;
    y = b;
  }
};
struct vec {
  double x, y;
};
struct Line {
  double a, b, c;
};
double dis(Point a, Point b) {
  return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
bool issame(Point A, Point B) {
  double a = A.x - B.x;
  double b = A.y - B.y;
  if (abs(a) < 1e-7 && abs(b) < 1e-7) return 1;
  return 0;
}
vec Vector(Point a, Point b) {
  vec p;
  p.x = b.x - a.x;
  p.y = b.y - a.y;
  return p;
}
double dot(vec a, vec b) { return a.x * b.x + a.y * b.y; }
double cross(vec a, vec b) { return a.x * b.y - a.y * b.x; }
double length(vec a) { return sqrt(pow(a.x, 2) + pow(a.y, 2)); }
double dist(Point a, Point b, Point c) {
  vec AB = Vector(a, b), AC = Vector(a, c), BC = Vector(b, c),
      BA = Vector(b, a);
  if (dot(AB, BC) > 0) return dis(c, b);
  if (dot(BA, AC) > 0) return dis(a, c);
  return abs(cross(AB, AC) / (length(AB)));
}
Point A[1000010];
int main() {
  int n = read(), a = read(), b = read();
  double mini = 10000000000000000;
  double maxi = -1;
  for (int i = 0; i < n; ++i) {
    int c = read(), d = read();
    A[i] = Point(c, d);
    maxi = max(maxi, dis(A[i], Point(a, b)));
  }
  for (int i = 0; i < n; ++i) {
    mini = min(mini, dist(A[i], A[(i + 1) % n], Point(a, b)));
  }
  double ans = acos(-1) * (maxi * maxi - mini * mini);
  printf("%.17lf", ans);
}
