#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
#include <complex>

using namespace std;

#define FOR(i,k,n) for(int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)

template<class T> void debug(T begin, T end){ for(T i = begin; i != end; ++i) cerr<<*i<<" "; cerr<<endl; }
inline bool valid(int x, int y, int W, int H){ return (x >= 0 && y >= 0 && x < W && y < H); }

typedef long long ll;
const int INF = 100000000;
const double EPS = 1e-8;
const int MOD = 1000000007;
int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};

typedef long double D;
typedef complex<long double> P;
typedef pair<P, P> L;

#define X real()
#define Y imag()

P vect(L l) {return l.second - l.first;}

const D gravity = 9.8;
D get_y(P velocity, P initial, D x){
  assert(x - initial.X >= 0);
  D t = (x - initial.X) / velocity.X;
  return initial.Y + velocity.Y * t - 0.5 * gravity * t * t;
}
D fun(P v, D t){
  return sqrt(v.X * v.X + (v.Y - gravity * t) * (v.Y - gravity * t));
}
D get_length(P initial, P cross, P velocity){
  D t = (cross.X - initial.X) / velocity.X;
  return t / 6.0 * (fun(velocity, 0) + 4 * fun(velocity, t / 2) + fun(velocity, t));
}

int main(){
  int N;
  D V;
  while(cin>>N>>V){
    vector<P> endpoints(N);
    REP(i, N){
      scanf("%Lf %Lf", &endpoints[i].X, &endpoints[i].Y);
    }
    vector<L> lines(N - 1);
    REP(i, N - 1){
      lines[i] = L(endpoints[i], endpoints[i + 1]);
    }
    bool inair = false;
    P jump_point;
    P velocity;
    D ans = 0;
    REP(i, lines.size()){
#ifdef DEBUG
      printf("line %d: ", i);
      cout<<lines[i].first<<" "<<lines[i].second<<endl;
#endif
      if(inair){
        if(get_y(velocity, jump_point, lines[i].second.X) > lines[i].second.Y){
        }else{
          D lb = 0.0, ub = 1.0;
          P u = lines[i].first;
          P v = vect(lines[i]);
          // u + x * v (0 < x < 1)
          REP(iter, 100){
            D mid = (lb + ub) / 2;
            P mid_p = u + mid * v;
            if(get_y(velocity, jump_point, mid_p.X) < mid_p.Y){
              ub = mid;
            }else{
              lb = mid;
            }
          }
          P cross = u + lb * v;
          //ans += get_length(jump_point, cross, velocity);
#ifdef DEBUG
          printf("get on ");
          cout<<cross;
          printf("(k = %LF) and run on ground %Lf m\n", lb, abs((1 - lb) * v));
#endif
          ans += abs((1 - lb) * v);
          inair = false;
        }
      }else{
#ifdef DEBUG
        printf("run on ground %Lf m\n", abs(vect(lines[i])));
#endif
        ans += abs(vect(lines[i]));
      }
      if(!inair && i + 1 < lines.size() && arg(vect(lines[i])) > arg(vect(lines[i + 1]))){
        inair = true;
        jump_point = lines[i].second;
        velocity = polar(V, arg(vect(lines[i])));
#ifdef DEBUG
        printf("jump from "); cout<<jump_point<<" (v = "<<velocity<<")"<<endl;
#endif
      }
    }
    printf("%.8Lf\n", ans);
  }
  return 0;
}

Measured memory_bytes: 2060