// Bai 5
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N = 3000;
const int MAX_LINE = 3000;
const int MOD = 1e9 + 7;
const ll INF = 1e18;
template <class X, class Y>
bool minimize(X &x, const Y &y) {
if (x <= y) return false;
x = y;
return true;
};
struct Line {
ll a, b;
Line() {};
Line(ll a, ll b) : a(a), b(b) {};
ll eval(ll x) { return a * x + b; };
double intersect(const Line &other) const {
return (double)(other.b - b) / (a - other.a);
};
};
struct ConvexHullTrick {
Line line[MAX_LINE + 5];
int ptr, sz;
void addLine(const Line &newLine) {
while (sz > 1 && line[sz - 2].intersect(newLine) <= line[sz - 2].intersect(line[sz - 1])) sz--;
line[sz++] = newLine;
if (ptr >= sz) ptr = max(0, sz - 1);
};
ll query(ll x) {
while (ptr + 1 < sz && line[ptr].eval(x) >= line[ptr + 1].eval(x)) ptr++;
return line[ptr].eval(x);
};
void reset() { ptr = sz = 0; };
ConvexHullTrick() { reset(); };
};
int n, k;
int a[MAX_N + 5];
ll sqr(ll x) {
return x * x;
};
namespace SUBTASK_1 {
const int N = MAX_N;
const int K = 2;
void Solve() {
ll total = 0;
for (int i = 1; i <= n; i++) total += a[i];
ll res = INF;
for (int l = 1; l <= n; l++) {
ll sum = 0;
for (int r = l; r <= n; r++) {
sum += a[r];
minimize(res, sqr(sum) + sqr(total - sum));
};
};
cout << res << '\n';
};
}; // namespace SUBTASK_1
namespace SUBTASK_3 {
const int N = 300;
ll dp[N + 5][N + 5];
int b[N + 5];
ll DP(int b[]) {
for (int i = 0; i <= k; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = INF;
};
};
dp[0][0] = 0;
for (int i = 1; i <= k; i++) {
for (int r = i; r <= n; r++) {
ll sum = 0;
for (int l = r; l >= i; l--) {
sum += b[l];
minimize(dp[i][r], dp[i - 1][l - 1] + sqr(sum));
};
};
};
return dp[k][n];
};
void Solve() {
ll res = INF;
for (int startAt = 1; startAt <= n; startAt++) {
for (int i = startAt; i <= startAt + n - 1; i++)
b[i - startAt + 1] = a[i];
minimize(res, DP(b));
};
cout << res << '\n';
};
}; // namespace SUBTASK_3
namespace SUBTASK_5 {
const int N = 500;
ConvexHullTrick cht;
ll dp[N + 5][N + 5];
ll pref[N + 5];
ll DP(ll pref[]) {
for (int i = 0; i <= k; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = INF;
};
};
dp[0][0] = 0;
for (int i = 1; i <= k; i++) {
cht.reset();
for (int r = i; r <= n; r++) {
ll a = pref[r - 1] * -2;
ll b = dp[i - 1][r - 1] + sqr(pref[r - 1]);
cht.addLine(Line(a, b));
dp[i][r] = cht.query(pref[r]) + sqr(pref[r]);
};
};
return dp[k][n];
};
void Solve() {
ll res = INF;
for (int startAt = 1; startAt <= n; startAt++) {
pref[1] = a[startAt];
for (int i = startAt + 1; i <= startAt + n - 1; i++)
pref[i - startAt + 1] = pref[i - startAt] + a[i];
minimize(res, DP(pref));
};
cout << res << '\n';
};
}; // namespace SUBTASK_5
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
if (fopen("MAIN.INP", "r")) {
freopen("MAIN.INP", "r", stdin);
freopen("MAIN.OUT", "w", stdout);
};
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i + n] = a[i];
};
if (k == 2)
return SUBTASK_1::Solve(), 0;
if (n <= 100 && k <= 100)
return SUBTASK_3::Solve(), 0;
SUBTASK_5::Solve();
};