#include <bits/stdc++.h>
using namespace std;
pair<long long int, long long int> operator-(
    pair<long long int, long long int> p1,
    pair<long long int, long long int> p2) {
  p1.first -= p2.first;
  p1.second -= p2.second;
  return p1;
}
long long int modulcuadrat(pair<long long int, long long int> p) {
  return p.first * p.first + p.second * p.second;
}
long long int prodvec(pair<long long int, long long int> p1,
                      pair<long long int, long long int> p2) {
  return p1.first * p2.second - p1.second * p2.first;
}
vector<pair<long long int, long long int> > pu;
bool comparacoord(int i1, int i2) { return pu[i1] < pu[i2]; }
bool comparaangulo(int i1, int i2) {
  pair<long long int, long long int> p1 = pu[i1];
  pair<long long int, long long int> p2 = pu[i2];
  long long int prod = prodvec(p1, p2);
  if (prod > 0) return true;
  if (prod == 0) return modulcuadrat(p1) < modulcuadrat(p2);
  return false;
}
long long int llegeixcoord() {
  string s;
  cin >> s;
  int index = 0;
  long long int val = 0;
  int signo = 1;
  if (s[index] == '-') {
    signo = -1;
    index++;
  }
  while (index < int(s.size()) and s[index] != '.') {
    val = val * 10 + s[index] - '0';
    index++;
  }
  index++;
  for (int i = 0; i < 3; i++, index++) {
    int digito = 0;
    if (index < int(s.size())) digito = s[index] - '0';
    val = val * 10 + digito;
  }
  return signo * val;
}
pair<long long int, long long int> llegeix() {
  long long int x = llegeixcoord();
  long long int y = llegeixcoord();
  return pair<long long int, long long int>(x, y);
}
double error = 0.0000001;
complex<double> topoint(pair<long long int, long long int> p) {
  return complex<double>(p.first, p.second);
}
double prodvec(complex<double> p1, complex<double> p2) {
  return imag(conj(p1) * p2);
}
bool eliminar(complex<double> p2, complex<double> p1, complex<double> p0,
              double r) {
  complex<double> inter = (p0 + p2) / 2.0;
  complex<double> vinter = inter - p0;
  complex<double> vinteruni = vinter / abs(vinter);
  double distintercenter = sqrt(r * r - norm(vinter));
  complex<double> center =
      inter + vinteruni * complex<double>(0, 1) * distintercenter;
  return abs(p1 - center) <= r + error;
}
bool eliminar(pair<long long int, long long int> p2,
              pair<long long int, long long int> p1,
              pair<long long int, long long int> p0, int r) {
  return eliminar(topoint(p2), topoint(p1), topoint(p0), r);
}
void escriupoint(complex<double> p) {
  cout << "(" << real(p) << "," << imag(p) << ")";
}
double areaexterior(complex<double> p1, complex<double> p2, double r) {
  complex<double> inter = (p1 + p2) / 2.0;
  complex<double> vinter = inter - p1;
  complex<double> vinteruni = vinter / abs(vinter);
  double distintercenter = sqrt(r * r - norm(vinter));
  complex<double> center =
      inter + vinteruni * complex<double>(0, 1) * distintercenter;
  complex<double> diff = (p2 - center) / (p1 - center);
  return abs(arg(diff)) * r * r / 2.0 - prodvec(p1 - center, p2 - center) / 2.0;
}
double areaexterior(pair<long long int, long long int> p1,
                    pair<long long int, long long int> p2, int r) {
  return areaexterior(topoint(p1), topoint(p2), r);
}
void escriu(vector<int> v) {
  for (int i = 0; i < int(v.size()); i++) cout << v[i] << ",";
  cout << endl;
}
int main() {
  cout.setf(ios::fixed);
  cout.precision(10);
  int n;
  long long int r;
  cin >> n >> r;
  r *= 1000;
  pu = vector<pair<long long int, long long int> >(n);
  vector<int> v(n);
  for (int i = 0; i < n; i++) {
    pu[i] = llegeix();
    v[i] = i;
  }
  if (n == 1) {
    cout << 0.0 << endl;
    exit(0);
  }
  sort(v.begin(), v.end(), comparacoord);
  for (int i = 1; i < n; i++) pu[v[i]] = pu[v[i]] - pu[v[0]];
  pu[v[0]] = pair<long long int, long long int>(0, 0);
  sort(++(v.begin()), v.end(), comparaangulo);
  vector<int> env(1, v[0]);
  for (int i = 1; i < n; i++) {
    pair<long long int, long long int> p = pu[v[i]];
    while (int(env.size()) >= 2 and
           prodvec(pu[env.back()] - pu[env[int(env.size()) - 2]],
                   p - pu[env.back()]) <= 0)
      env.pop_back();
    env.push_back(v[i]);
  }
  v = env;
  for (int i = 0; i < int(env.size()); i++) v.push_back(env[i]);
  vector<int> ext(1, v[0]);
  for (int i = 1; i < int(v.size()); i++) {
    pair<long long int, long long int> p = pu[v[i]];
    while (int(ext.size()) >= 2 and v[i] != ext[int(ext.size()) - 2] and
           eliminar(p, pu[ext.back()], pu[ext[int(ext.size()) - 2]], r))
      ext.pop_back();
    ext.push_back(v[i]);
  }
  vector<int> visto(n, -1);
  vector<int> per;
  for (int i = 0; i < int(ext.size()); i++) {
    int pos = ext[i];
    if (visto[pos] >= 0) {
      for (int j = visto[pos]; j < i; j++) per.push_back(ext[j]);
      break;
    } else
      visto[pos] = i;
  }
  double area = 0;
  pair<long long int, long long int> pbase = pu[per[0]];
  for (int i = 0; i < int(per.size()); i++) {
    int nexti = (i + 1) % int(per.size());
    pair<long long int, long long int> p1 = pu[per[i]];
    pair<long long int, long long int> p2 = pu[per[nexti]];
    area += prodvec(p1 - pbase, p2 - pbase) / 2.0 + areaexterior(p1, p2, r);
  }
  cout << area / 1000000.0 << endl;
}
