#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
struct Point {
  double x, y;
} p[maxn];
double a, b;
int n;
double GetPointDistance(Point p1, Point p2) {
  return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double GetNearestDistance(Point PA, Point PB, Point P3) {
  double a, b, c;
  a = GetPointDistance(PB, P3);
  if (a <= 0.00001) return 0.0f;
  b = GetPointDistance(PA, P3);
  if (b <= 0.00001) return 0.0f;
  c = GetPointDistance(PA, PB);
  if (c <= 0.00001) return a;
  if (a * a >= b * b + c * c) return b;
  if (b * b >= a * a + c * c) return a;
  double l = (a + b + c) / 2;
  double s = sqrt(l * (l - a) * (l - b) * (l - c));
  return 2 * s / c;
}
int main() {
  double Max = -1;
  double Min = -1;
  scanf("%d%lf%lf", &n, &a, &b);
  Point T;
  T.x = a;
  T.y = b;
  for (int i = 0; i < n; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
  for (int i = 0; i < n; i++) {
    if (i == n - 1) {
      double MinLen = GetNearestDistance(p[0], p[i], T);
      if (Min == -1)
        Min = MinLen;
      else
        Min = min(Min, MinLen);
      double Len1 =
          sqrt((p[i].x - a) * (p[i].x - a) + (p[i].y - b) * (p[i].y - b));
      double Len2 =
          sqrt((p[0].x - a) * (p[0].x - a) + (p[0].y - b) * (p[0].y - b));
      double MaxLen = max(Len1, Len2);
      if (Max == -1)
        Max = MaxLen;
      else
        Max = max(Max, MaxLen);
    } else {
      double MinLen = GetNearestDistance(p[i + 1], p[i], T);
      if (Min == -1)
        Min = MinLen;
      else
        Min = min(Min, MinLen);
      double Len1 =
          sqrt((p[i].x - a) * (p[i].x - a) + (p[i].y - b) * (p[i].y - b));
      double Len2 = sqrt((p[i + 1].x - a) * (p[i + 1].x - a) +
                         (p[i + 1].y - b) * (p[i + 1].y - b));
      double MaxLen = max(Len1, Len2);
      if (Max == -1)
        Max = MaxLen;
      else
        Max = max(Max, MaxLen);
    }
  }
  printf("%lf\n", 3.1415926 * (Max * Max - Min * Min));
  return 0;
}
