#include <bits/stdc++.h>
using namespace std;
int n;
pair<double, double> p;
vector<pair<double, double> > v;
double R, r;
class RangePoint {
 public:
  double x, y, d;
  RangePoint() {}
  RangePoint(double x, double y, double d) {
    this->x = x;
    this->y = y;
    this->d = d;
  }
};
vector<RangePoint> rangeV;
bool cmp(const RangePoint &a, const RangePoint &b) { return a.d > b.d; }
void initialize() {
  cin >> n >> p.first >> p.second;
  for (int i = 0; i < n; i++) {
    double a, b;
    cin >> a >> b;
    v.push_back(make_pair(a, b));
  }
}
double getDistance(double x1, double y1, double x2, double y2) {
  return ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
bool check(RangePoint a, RangePoint b) {
  if ((a.x < p.first && b.x > p.first) || (a.x > p.first && b.x < p.first) ||
      (a.y < p.second && b.y > p.second) || (a.y > p.second && b.y < p.second))
    return false;
  return true;
}
void solve() {
  r = 2147483647;
  R = -1;
  for (int i = 0; i < n; i++) {
    double d = getDistance(v[i].first, v[i].second, p.first, p.second);
    rangeV.push_back(RangePoint(v[i].first, v[i].second, d));
    if (sqrt(rangeV[i].d) > R) R = sqrt(rangeV[i].d);
    if (sqrt(rangeV[i].d) < r) r = sqrt(rangeV[i].d);
  }
  for (int i = 0; i < n; i++) {
    int j = (i + 1) % n;
    double tmp =
        getDistance(rangeV[i].x, rangeV[i].y, rangeV[j].x, rangeV[j].y);
    if (tmp + rangeV[i].d < rangeV[j].d || rangeV[j].d + tmp < rangeV[i].d)
      continue;
    double area = (p.first - rangeV[i].x) * (p.second - rangeV[j].y) -
                  (p.first - rangeV[j].x) * (p.second - rangeV[i].y);
    double d = fabs(area / sqrt(tmp));
    r = min(d, r);
  }
  cout << setprecision(6) << fixed << (R * R - r * r) * 3.141592 << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  initialize();
  solve();
  return 0;
}
