100分代码
/*
[a[i],a[i+1]) f[x] = i
[k*r,(k+1)*r) g[x] = k
划分成n段
[l,right)
f[x] = l
k = l / r
g[x] = k
每一小段中有 ceil((right - l) / r) = t 个小小段
[l,r1) k1 k1 = (l / r) r1 = (k1+1) * r
[r1,r2) k2 k2 = k1 + 1
...
[rn-1,right] kt
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[1000010];
int r;
int calc2(int ll,int rr,int k,int ff){
return (rr - ll) * abs(ff-k);
}
int calc(int l,int right,int f){
// int t = ceil((right-l*1.0)/r);
// cout << "f=" << f << endl;
// cout << "l=" << l << " r=" << right << endl;
// cout << "t=" << t << endl;
int res = 0;
int k = l / r;
int l1 = l;
int r1 = min((k+1) * r, right);
while(true){
res += calc2(l1,r1,k,f); // [l1,r1) g[x] = k
// cout << "l1=" << l1 << " r1=" << r1 << endl;
// cout << "calc2 = " << calc2(l1,r1,k,f) << endl;
if(r1==right) break;
l1 = r1;
k = k + 1;
r1 = min((k+1) * r, right);
}
return res;
}
signed main()
{
int n,N;
// cin >> n >> N;
scanf("%lld%lld",&n,&N);
r = N / (n+1);
// cout << "r=" << r << endl;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
int ans = 0;
for(int i=1;i<=n;i++){
int l = a[i-1];
int right = a[i]; // [l,r)
ans += calc(l,right,i-1);
// f[x] = l;
}
ans += calc(a[n],N,n);
// cout << ans << endl;
printf("%lld\n",ans);
return 0;
}