void main(){
  import std.stdio, std.string, std.conv, std.algorithm;

  int n; long x; rd(n, x);
  auto a=readln.split.to!(long[]);
  a=0L~a;
  if(n>2000){
    writeln(-1);
    return;
  }

  const long inf=1_000_000_000_000_000_000;
  auto cost=new long[][](n+1, n+1); // cost[i][j]:=iからjに戻るときのコスト i>=j iで回収するコストも含む
  for(int i=0; i<=n; i++) fill(cost[i], inf);
  for(int i=0; i<=n; i++){
    cost[i][i]=0;
    int num=1;
    for(int j=i; j>0; j--){
      cost[i][j-1]=cost[i][j]+x+(num+1)*(num+1)*(a[j]-a[j-1]);
      num++;
    }
  }
  // foreach(i; 0..n+1){
  //   // writeln(i);
  //   // writeln(cost[i]);
  // }

  auto dp=new long[](n+1); // dp[i]:=[0, i]のゴミを回収する最小コスト
  fill(dp, inf);
  dp[0]=0;
  for(int i=0; i<n; i++){ // [0, i]までゴミ箱に入れた
    for(int j=i+1; j<=n; j++){
      // long c=a[j], num=0; // ゴミjまで移動
      // for(int k=j; k>i; k--){
      //   c+=x; // ゴミkをとる
      //   num++;
      //   c+=(num+1)*(num+1)*(a[k]-a[k-1]); // ゴミk-1まで移動
      // }
      // c+=(num+1)*(num+1)*a[i]+x;
      long c=a[j]+cost[j][i+1]+x, num=j-i;
      c+=(num+1)*(num+1)*a[i+1]+x;
      dp[j]=min(dp[j], dp[i]+c);
    }
  }
  writeln(dp[n]);
  // writeln(dp);
}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x) e=l[i].to!(typeof(e));
}
