#include <bits/stdc++.h>
using namespace std;
struct PointVector {
  long long int x;
  long long int y;
};
PointVector findVector(PointVector P1, PointVector P2) {
  PointVector newVec = {P2.x - P1.x, P2.y - P1.y};
  return newVec;
}
long double magnitude(PointVector P) { return sqrt(P.x * P.x + P.y * P.y); }
long double DotProduct(PointVector P1, PointVector P2) {
  return P1.x * P2.x + P1.y * P2.y;
}
long double CrossProduct(PointVector P1, PointVector P2) {
  return (P1.x * P2.y) - (P1.y * P2.x);
}
long double ratio1(PointVector P0, PointVector P1, PointVector P2) {
  return CrossProduct(findVector(P0, P1), findVector(P1, P2)) /
         magnitude(findVector(P1, P2));
}
int main() {
  unsigned long long int N;
  long double maxDist = 0, dist, minDist = 99999999999999, Area = 0, height = 0,
              r1, r2;
  long long int x, y;
  cin >> N >> x >> y;
  PointVector origin = {x, y};
  vector<PointVector> coord;
  vector<long double> distances;
  for (unsigned long long int i = 0; i < N; ++i) {
    cin >> x >> y;
    coord.push_back(PointVector{x, y});
    dist = (double)sqrt((origin.x - x) * (origin.x - x) +
                        (origin.y - y) * (origin.y - y));
    if (dist > maxDist) maxDist = dist;
    if (dist < minDist) minDist = dist;
    distances.push_back(dist);
  }
  long double temp;
  long long int j = 1;
  for (long long int i = 0; i < N; ++i, j = (i + 1) % coord.size()) {
    if (DotProduct(findVector(coord[i], origin),
                   findVector(coord[i], coord[j])) >= 0 &&
        DotProduct(findVector(coord[j], origin),
                   findVector(coord[j], coord[i])) >= 0) {
      minDist = min(minDist, abs(CrossProduct(findVector(origin, coord[i]),
                                              findVector(coord[i], coord[j]))) /
                                 magnitude(findVector(coord[i], coord[j])));
    }
  }
  Area = M_PI * maxDist * maxDist - M_PI * minDist * minDist;
  cout.precision(21);
  cout << Area << endl;
  return 0;
}
