#include <bits/stdc++.h>
template <typename T>
bool Chkmax(T &x, T y) {
  return x < y ? x = y, true : false;
}
template <typename T>
bool Chkmin(T &x, T y) {
  return y < x ? x = y, true : false;
}
const int MAXN = 1e5 + 1e3;
const double INF = 1e30;
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  inline void Scanf() { scanf("%lf%lf", &x, &y); }
} a[MAXN], p;
Point operator-(const Point &A, const Point &B) {
  return Point(A.x - B.x, A.y - B.y);
}
inline double Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
inline double Length(Point A) { return sqrt(Dot(A, A)); }
inline double Cross(Point A, Point B) { return A.x * B.y - B.x * A.y; }
inline double Dist(Point A, Point B) {
  return sqrt(pow(A.x - B.x, 2) + pow(A.y - B.y, 2));
}
int n;
double maxx = -INF, minx = INF;
int main() {
  if (fopen("A.in", "r") != NULL) {
    freopen("A.in", "r", stdin);
    freopen("A.out", "w", stdout);
  }
  scanf("%d", &n);
  p.Scanf();
  for (int i = 1, _ = n; i <= _; i++) a[i].Scanf();
  a[n + 1] = a[1];
  for (int i = 1, _ = n; i <= _; i++) {
    Chkmax(maxx, Dist(p, a[i]));
    Chkmin(minx, Dist(p, a[i]));
    if (Dot(p - a[i], a[i + 1] - a[i]) > 0 &&
        Dot(p - a[i + 1], a[i] - a[i + 1]) > 0)
      Chkmin(minx,
             fabs(Cross(a[i] - p, a[i] - a[i + 1])) / Length(a[i] - a[i + 1]));
  }
  printf("%.10lf\n", acos(-1) * (maxx * maxx - minx * minx));
  return 0;
}
