//#include #include #include #include #include #include #include #define ll long long using namespace std; int n,m,k,l,x; struct pos { pos(double time_, int loc_) : time(time_), loc(loc_) {} double time; int loc; friend bool operator<(const pos & l, const pos & r) { return (l.time > r.time); } }; int main() { //ios::sync_with_stdio(false); //cout << setprecision(10); while(scanf("%d %d", &n, &m) != -1) { double sum = 0; priority_queue pq; vector done = vector(n+1, false); vector data = vector(n+1); vector next = vector(n+1); vector prev = vector(n+1); vector str = vector(n+1,1); vector times = vector(n+1); for(int i = 0; i < n; i++){ scanf("%d", &data[i]); next[i] = i+1; prev[i] = i-1; sum += data[i]/(double)m; pq.push(pos(data[i]/(double)m,i)); times[i]= data[i]/(double)m; } double rtime = 0; double acttime = 0; while(!pq.empty()) { pos p = pq.top(); pq.pop(); //printf("%.10f %d\n", p.time, p.loc); if (!done[p.loc]) { acttime = p.time; if (p.loc == n-1) { rtime = acttime; } done[p.loc] = true; int p1 = prev[p.loc], p2 = next[p.loc]; int diff = p2 - p1; if (p1>= 0) next[p1] = p2; if (p2 < n) { prev[p2] = p1; double newtime = (times[p2]-acttime)*(double)str[p2]/(double)diff + acttime; //printf("%d %d %d %.10f\n",p2,diff, str[p2], newtime); times[p2] = newtime; str[p2] = diff; pq.push(pos(newtime, p2)); } } } printf("%.10f %.10f\n", rtime, acttime); } return 0; }