#include <bits/stdc++.h>
using namespace std;
enum STATE { IN, OUT, BOUNDRY };
complex<double> polygon[100005];
complex<double> centre;
int n;
double pointLineDist(const complex<double>& a, const complex<double>& b,
                     const complex<double>& p) {
  return fabs(((conj(((b) - (a))) * (((p) - (a)))).imag()) /
              ((double)hypot((((b) - (a))).imag(), (((b) - (a))).real())));
}
double pointSegmentDist(const complex<double>& a, const complex<double>& b,
                        const complex<double>& p) {
  if (((conj(((b) - (a))) * (((p) - (a)))).real()) < 1e-9)
    return ((double)hypot((((p) - (a))).imag(), (((p) - (a))).real()));
  if (((conj(((a) - (b))) * (((p) - (b)))).real()) < 1e-9)
    return ((double)hypot((((p) - (b))).imag(), (((p) - (b))).real()));
  return pointLineDist(a, b, p);
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n;
  int x, y;
  cin >> x >> y;
  centre = complex<double>(x, y);
  for (int i = 0; i < n; ++i) {
    cin >> x >> y;
    polygon[i] = complex<double>(x, y);
  }
  polygon[n] = polygon[0];
  double r2 = 0, r1 = 1e7;
  for (int i = 0; i < n; ++i) {
    r2 = max(r2, hypot(polygon[i].real() - centre.real(),
                       polygon[i].imag() - centre.imag()));
    r1 = min(r1, pointSegmentDist(polygon[i], polygon[i + 1], centre));
  }
  cout << fixed << setprecision(6) << acos(-1) * (r2 * r2 - r1 * r1);
}
