#include <bits/stdc++.h>
using namespace std;
double INF = 1e100;
double EPS = 1e-12;
struct PT {
  double x, y;
  PT() {}
  PT(double x, double y) : x(x), y(y) {}
  PT(const PT &p) : x(p.x), y(p.y) {}
  PT operator+(const PT &p) const { return PT(x + p.x, y + p.y); }
  PT operator-(const PT &p) const { return PT(x - p.x, y - p.y); }
  PT operator*(double c) const { return PT(x * c, y * c); }
  PT operator/(double c) const { return PT(x / c, y / c); }
};
double dot(PT p, PT q) { return p.x * q.x + p.y * q.y; }
double dist2(PT p, PT q) { return dot(p - q, p - q); }
double cross(PT p, PT q) { return p.x * q.y - p.y * q.x; }
ostream &operator<<(ostream &os, const PT &p) {
  os << "(" << p.x << "," << p.y << ")";
}
PT ProjectPointSegment(PT a, PT b, PT c) {
  double r = dot(b - a, b - a);
  if (fabs(r) < EPS) return a;
  r = dot(c - a, b - a) / r;
  if (r < 0) return a;
  if (r > 1) return b;
  return a + (b - a) * r;
}
double DistancePointSegment(PT a, PT b, PT c) {
  return dist2(c, ProjectPointSegment(a, b, c));
}
int main() {
  long long N;
  cin >> N;
  PT P, p[N + 1];
  cin >> P.x >> P.y;
  double mini = 2e15, maxi = -1.0;
  for (int i = (0); i < (N); i++) {
    cin >> p[i].x >> p[i].y;
    maxi = max(maxi, dist2(p[i], P));
  }
  p[N] = p[0];
  for (int i = (0); i < (N); i++) {
    mini = min(mini, DistancePointSegment(p[i], p[i + 1], P));
  }
  double ans = maxi - mini;
  ans *= acos(-1);
  printf("%.12lf\n", ans);
}
