import java.util.Scanner;
public class Main {
static int g(int x , int r){
return x / r;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int L = 0;
int n = scanner.nextInt();
int N = scanner.nextInt();
int r = N / (n + 1);
int[] a = new int[n + 5];
long sum = 0;
for(int i = 1 ; i <= n ; i++){
a[i] = scanner.nextInt();
}
a[n + 1] = N;
a[0] = 0;
for(int i = 1 ;i <= n + 1 ; i++){
long sum1 = 0 ;
for(int j = a[i -1] ; j <= a[i] - 1 ; j+=L){
int end = ((g(j , r) + 1) * r - 1);
if(end > a[i] - 1){
end = a[i] - 1;
}
int num_l = end - j + 1;
long f_g = Math.abs(i - 1 - g(j , r));
sum1 += f_g * num_l;
L = num_l;
}
sum += sum1;
}
System.out.println(sum);
}
}
此题与第一题有联系,f(x)定义:序列A中小于等于x的整数里的最大的数的下标。
g(x)计算方式:r=N/(n+1) g(x)=x/r
核心就在于分段求解