#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, head, tail;
int use;
int sum[2000], dp[2000][2], q[2000], a[2000], cost[2000];
int getx(int x1, int x2) {
return sum[x2] - sum[x1];
}
int gety(int y1, int y2) {
return dp[y2][use ^ 1] - cost[y2] + sum[y2] * sum[y2] - (dp[y1][use ^ 1] - cost[y1] + sum[y1] * sum[y1]);
}
int main() {
sum[0] = 0;
while (scanf("%d%d", &n, &m) != EOF, n + m) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
memset(dp, 0, sizeof(dp));
memset(cost, 0, sizeof(cost));
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
cost[j] += a[i] * a[j];
}
}
for (int i = 1; i <= n; i++) {
cost[i] += cost[i - 1];
}
use = 0;
for (int i = 1; i <= n; i++) {
dp[i][use] = cost[i];
}
for (int j = 1; j <= m; j++) {
use = use ^ 1;
head = tail = 0;
q[tail++] = 0;
for (int i = 1; i <= n; i++) {
while (head + 1 < tail && gety(q[head], q[head + 1]) <= getx(q[head], q[head + 1]) * sum[i]) {
head++;
}
dp[i][use] = dp[q[head]][use ^ 1] + cost[i] - cost[q[head]] - sum[i] * sum[q[head]] +
sum[q[head]] * sum[q[head]];
while (head + 1 < tail && gety(q[tail - 1], i) * getx(q[tail - 2], q[tail - 1]) <=
gety(q[tail - 2], q[tail - 1]) * getx(q[tail - 1], i)) {
tail--;
}
q[tail++] = i;
}
}
printf("%d\n", dp[n][use]);
}
return 0;
}