#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
const long double Pi = 3.1415926535897932;
struct point {
  int x, y;
} p, a[N];
int n;
long double mx, mn;
long double dist(point a, point b) {
  long double ans;
  ans = sqrt(1.0 * (a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
  return ans;
}
struct node {
  long double x, y;
} v[4];
long double F() {
  long double ans = Pi * (mx * mx - mn * mn);
  return ans;
}
long double len(node a) { return sqrt(1.0 * a.x * a.x + 1.0 * a.y * a.y); }
node do_it(point a, point b) {
  node result;
  result.x = b.x - a.x;
  result.y = b.y - a.y;
  return result;
}
long double dot(node a, node b) { return 1.0 * a.x * b.x + 1.0 * a.y * b.y; }
long double cross(node a, node b) { return 1.0 * a.x * b.y - 1.0 * b.x * a.y; }
long double dist_Point_line(point a, point b, point c) {
  v[0] = do_it(a, b);
  v[1] = do_it(a, c);
  double area = fabs(cross(v[0], v[1]));
  return area / (len(v[0]));
}
long double dist_Point_segment(point a, point b, point c) {
  v[0] = do_it(a, b);
  v[1] = do_it(a, c);
  v[2] = do_it(b, a);
  v[3] = do_it(b, c);
  if (dot(v[0], v[1]) >= 0 && dot(v[2], v[3]) >= 0)
    return dist_Point_line(a, b, c);
  else
    return min(len(v[1]), len(v[3]));
}
int main() {
  scanf("%d%d%d", &n, &p.x, &p.y);
  mn = 1e40;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a[i].x, &a[i].y);
    mx = max(mx, dist(a[i], p));
    mn = min(mn, dist(a[i], p));
  }
  a[n + 1] = a[1];
  for (int i = 1; i <= n; i++) {
    int nxt = i + 1;
    if (nxt > n) nxt = 1;
    mx = max(mx, dist_Point_segment(a[i], a[nxt], p));
    mn = min(mn, dist_Point_segment(a[i], a[nxt], p));
  }
  cout << fixed << setprecision(15) << F() << endl;
  return 0;
}
