#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double EPS = 1e-10;
int dcmp(double x) {
  if (fabs(x) < EPS)
    return 0;
  else
    return x < 0 ? -1 : 1;
}
struct Point {
  double x, y;
  Point() {}
  Point(double x, double y) : x(x), y(y) {}
  Point operator-(const Point &r) const { return Point(x - r.x, y - r.y); }
  bool operator==(const Point &r) const {
    return dcmp(x - r.x) == 0 && dcmp(y - r.y) == 0;
  }
};
double cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double length(Point A) { return sqrt(dot(A, A)); }
Point read_point(void) {
  double x, y;
  scanf("%lf%lf", &x, &y);
  return Point(x, y);
}
Point o;
double squ(double x) { return x * x; }
bool cmp(Point a, Point b) {
  double la = squ(a.x - o.x) + squ(a.y - o.y);
  double lb = squ(b.x - o.x) + squ(b.y - o.y);
  return dcmp(la - lb) < 0;
}
double point_to_seg(Point p, Point a, Point b) {
  if (a == b) return length(p - a);
  Point V1 = b - a, V2 = p - a, V3 = p - b;
  if (dcmp(dot(V1, V2)) < 0)
    return length(V2);
  else if (dcmp(dot(V1, V3)) > 0)
    return length(V3);
  else
    return fabs(cross(V1, V2)) / length(V1);
}
Point p[N];
int main(void) {
  int n;
  scanf("%d", &n);
  o = read_point();
  double mn = 1e16;
  bool flag = true;
  for (int i = 0; i < n; ++i) {
    p[i] = read_point();
    if (i > 0) {
      double dis = point_to_seg(o, p[i], p[i - 1]);
      if (dcmp(dis - mn) < 0) mn = dis;
    }
  }
  double dis = point_to_seg(o, p[0], p[n - 1]);
  if (dcmp(dis - mn) < 0) mn = dis;
  sort(p, p + n, cmp);
  double r2 = squ(p[0].x - o.x) + squ(p[0].y - o.y);
  if (dcmp(r2 - squ(mn)) > 0) r2 = squ(mn);
  double R2 = squ(p[n - 1].x - o.x) + squ(p[n - 1].y - o.y);
  if (!flag)
    printf("%.16f\n", PI * R2);
  else
    printf("%.16f\n", PI * (R2 - r2));
  return 0;
}
