#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500100;
struct PP {
  double x, y;
  PP() {}
  PP(long long xx, long long yy) {
    x = xx;
    y = yy;
  }
  void scan() { cin >> x >> y; }
  PP operator-(PP b) { return PP(x - b.x, y - b.y); }
  long long operator%(PP b) { return (x * b.y - y * b.x); }
  long long operator*(PP b) { return (x * b.x + y * b.y); }
  double len() { return x * x + y * y; }
  double len(PP p) { return (*this - p).len(); }
} P;
long long px, py;
long long a, b, c;
void make_line(PP p, PP q) {
  a = p.y - q.y;
  b = q.x - p.x;
  c = -(a * p.x + b * p.y);
}
bool f(PP p, PP q) {
  PP v1 = P - p, v2 = q - p;
  if (v1 * v2 < 0) return false;
  v1 = P - q, v2 = p - q;
  if (v1 * v2 < 0) return false;
  return true;
}
int main() {
  int n;
  cin >> n;
  P.scan();
  PP p[n], M, m;
  double r, R;
  for (int i = 0; i < n; ++i) {
    p[i].scan();
    if (i == 0) {
      R = p[i].len(P);
      r = p[i].len(P);
    }
    r = min(r, p[i].len(P));
    R = max(R, p[i].len(P));
    if (i && f(p[i], p[i - 1])) {
      make_line(p[i], p[i - 1]);
      double D = (a * P.x + b * P.y + c);
      D *= D;
      D /= (double)(a * a + b * b);
      r = min(r, D);
    }
  }
  if (f(p[0], p[n - 1])) {
    make_line(p[0], p[n - 1]);
    double D = (a * P.x + b * P.y + c);
    D *= D;
    D /= (double)(a * a + b * b);
    r = min(r, D);
  }
  printf("%.20lf\n", (R - r) * acos(-1.));
  return 0;
}
