#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
const double PI = acos(-1);
const double eps = 1e-8;
inline int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return x < 0 ? -1 : 1;
}
struct Point {
  double x, y;
  Point() {}
  Point(double x, double y) : x(x), y(y) {}
  bool operator==(const Point& tmp) const {
    return dcmp(x - tmp.x) == 0 && dcmp(y - tmp.y) == 0;
  }
  Point operator-(const Point& tmp) const {
    return Point(x - tmp.x, y - tmp.y);
  }
} org, cur, last, first;
int n;
double maxx, minn = 1000000;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
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 - A.y * B.x; }
inline double Inter(Point A, Point B) {
  if (A == B) return Length(org - A);
  Point v1 = B - A, v2 = org - A, v3 = org - B;
  if (dcmp(Dot(v1, v2)) < 0 || dcmp(Dot(v1, v3)) > 0)
    return min(Length(v2), Length(v3));
  return fabs(Cross(v1, v2)) / Length(v1);
}
int main() {
  n = read(), org.x = read(), org.y = read();
  first.x = read(), first.y = read();
  double tmp = sqrt((first.x - org.x) * (first.x - org.x) +
                    (first.y - org.y) * (first.y - org.y));
  maxx = max(maxx, tmp);
  last = first;
  while (--n) {
    cur.x = read(), cur.y = read();
    double tmp = sqrt((cur.x - org.x) * (cur.x - org.x) +
                      (cur.y - org.y) * (cur.y - org.y));
    maxx = max(maxx, tmp);
    minn = min(minn, Inter(last, cur));
    last = cur;
  }
  last = cur;
  cur = first;
  minn = min(minn, Inter(last, cur));
  printf("%.8lf", PI * (maxx * maxx - minn * minn));
  return 0;
}
