合并石子
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

河童在河边发现了 n 堆石子,现在他想将这些石子合并为一堆。每次操作他可以将第 i1 \le i < n)堆中至多 k 个石子移动到第 i+1 堆,或者将第 i1 < i \le n)堆中至多 k 个石子移动到第 i - 1 堆。每次操作均消耗一点体力。
现在河童想知道将所有石子合并成一堆后,最少需要消耗多少点体力?

输入描述:

第一行,输入两个整数 n1 \le n \le 2 \cdot 10^5)和 k1 \le k \le 10^8),分别表示石子堆的数目和每次最多移动的石子个数。
第二行,输入 n 个整数 a_1,a_2, \cdots a_n1 \le a_i \le 10^8),a_i 表示第 i 堆石子的个数。

输出描述:

一行,一个整数,表示河童最小消耗的体力数。
示例1

输入

复制
2 5
6 5

输出

复制
1

说明

将第二组石子全部移动到第一组,每次移动 5 个,共消耗 1 点体力。
示例2

输入

复制
5 2
5 2 4 7 1

输出

复制
12

说明

将第一组石子全部移动到第二组,前两次移动 2 个,最后一次移动 1 个,本轮消耗 3 点体力,此时石子排列变为 [0, 7, 4, 7, 1]
将第二组石子全部移动到第三组,前三次移动 2 个,最后一次移动 1 个,本轮消耗 4 点体力,此时石子排列变为 [0, 0, 11, 7, 1]
将第五组石子全部移动到第四组,只移动一个石子,本轮消耗 1 点体力,此时石子排列变为 [0, 0, 11, 8, 0]
将第四组石子全部移动到第三组,每次移动 2 个,本轮消耗 4 点体力,此时石子排列变为 [0, 0, 19, 0, 0]
合并完成,共消耗 3 + 4 + 1 + 4 = 12 点体力。
示例3

输入

复制
2 1
7 9

输出

复制
7

说明

将第一组石子全部移动到第二组,每次移动 1 个,消耗 7 点体力。