#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100000 + 10;
const double PI = M_PI;
const double eps = 1e-8;
int dcmp(double a) {
  if (fabs(a) < eps) return 0;
  if (a > 0) return 1;
  return -1;
}
struct Point {
  double x, y;
  Point operator+(const Point &A) { return (Point){A.x + x, A.y + y}; }
  Point operator-(const Point &A) { return (Point){x - A.x, y - A.y}; }
} P, Poly[Maxn];
int n;
struct Line {
  Point P;
  Point V;
} Line[Maxn];
double CalDJ(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double CalCJ(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double CalLen(Point A) { return sqrt(CalDJ(A, A)); }
double CalDIS(Point P, Point A, Point B) {
  Point v1 = B - A, v2 = P - A, v3 = P - B;
  if (dcmp(CalDJ(v1, v2)) < 0) return CalLen(v2);
  if (dcmp(CalDJ(v1, v3)) > 0) return CalLen(v3);
  return fabs(CalCJ(v1, v2) / CalLen(v1));
}
double Getdis(Point Q) {
  long long dx = Q.x - P.x, dy = Q.y - P.y;
  long long ret = dx * dx + dy * dy;
  return ret;
}
double Max, Min;
void solve() {
  scanf("%d", &n);
  scanf("%lf%lf", &P.x, &P.y);
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &Poly[i].x, &Poly[i].y);
  Min = Getdis(Poly[1]);
  for (int i = 1; i <= n; i++) {
    double di = Getdis(Poly[i]);
    if (di > Max) Max = di;
    if (di < Min) Min = di;
  }
  Poly[n + 1] = Poly[1];
  for (int i = 1; i <= n; i++) {
    double dis = CalDIS(P, Poly[i], Poly[i + 1]);
    dis = dis * dis;
    if (dis < Min) Min = dis;
  }
  double ans = PI * (Max - Min);
  printf("%lf\n", ans);
}
int main() {
  solve();
  return 0;
}
