#include #define FOR(i,a,b) for (int i=(a);i<(b);i++) #define FORR(i,a,b) for (int i=(a);i>=(b);i--) #define pb push_back #define pcnt __builtin_popcount #define show(x) cout<<#x<<" = "< pii; typedef vector vi; typedef vector vvi; typedef vector vpii; typedef set si; typedef pair pll; typedef vector vl; typedef vector vvl; typedef vector vpll; typedef set sl; templatestring join(vector&v) {stringstream s;FOR(i,0,sz(v))s<<' '<b)swap(a,b);for(;a>0;b%=a,swap(a,b));return b;} int modpow(ll a,ll n,int m){if(a==0)return a;ll p=1;for(;n>0;n/=2,a=a*a%m)if(n&1)p=p*a%m;return(int)p;} void dout(double d){printf("%.12f\n",d);} const int iinf = 1e9; const ll linf = 1e18; const int mod = 1e9+7; const double pi = acos(-1); const double eps = 1e-10; const int N=103; const int GN = N; struct Gauss{ int solve(int n, double o[GN][GN], double u[GN], double r[GN]) { int q; double m[GN][GN],v[GN], p; memmove(m,o,sizeof(m)); memmove(v,u,sizeof(v)); FOR(i, 0, n) { p = 0; q = 0; FOR(j, i, n) if(p < abs(m[i][j])){ p = abs(m[i][j]); q = j; } if(p < eps) return -1; swap(v[i],v[q]); FOR(k, i, n) swap(m[i][k], m[q][k]); v[i]/=m[i][i]; FORR(k, n-1, i) m[i][k]/=m[i][i]; FOR(j, i+1, n){ v[j]-=v[i]*m[j][i]; FORR(k, n-1, i) m[j][k]-=m[i][k]*m[j][i]; } } FORR(i, n-1, 0) { FORR(j, n-1, i+1){ v[i]-=m[i][j]*v[j]; m[i][j]=0; } r[i]=v[i]; } return 0; } }; double M[GN][GN], V[GN], R[GN], DP[2][GN]; int n, m, c[N]; Gauss g; main(){ cin.tie(0); ios::sync_with_stdio(false); cin >> n >> m; FOR(i, 2, n) cin >> c[i]; double rm = 1./m; int o = (m+1)/2, _j; FOR(i, 1, o+1){ FOR(j, 1, i){ M[i-1][j-1] += rm; V[i-1] += rm * c[n-j]; } FOR(j, 1, m-i+1){ _j = j > o ? m+1-j : j; M[i-1][_j-1] += rm; V[i-1] += rm * c[n-j]; } } g.solve(o, M, V, R); FOR(i, 0, o) DP[0][n-1-i] = R[i]; FORR(i, n-o-1, 1){ FOR(j, 1, m+1){ _j = i + j; if(_j > n) _j = 2 * n - _j; DP[0][i] += (DP[0][_j] + c[_j]) * rm; } } FORR(i, n-m-1, 1){ FOR(j, 1, m+1){ _j = i + j; if(_j > n) _j = 2 * n - _j; DP[1][i] += (DP[1][_j] + c[_j]) * rm; } FOR(j, 1, m){ _j = i + j; if(_j > n) _j = 2 * n - _j; mins(DP[1][i], DP[0][_j] + c[_j]); } } dout(DP[1][1]); }