```clike
#include<stdio.h>
#include<stdint.h>
#define N 25
#define K 15
// #define debug
uint64_t min(uint64_t a, uint64_t b){
return(a * (a < b) + b * (a >= b));
}
void solve(int arr[], int idx, int n,
uint64_t subsets[], int k, uint64_t nowsum, uint64_t *minsum){
if(idx >= n || nowsum >= *minsum){
*minsum = min(nowsum, *minsum);
#ifdef debug
printf("now minsum = %lu\n\n", *minsum);
#endif
return;
}
for(int i = 0; i < k; i++){
uint64_t now = nowsum - subsets[i] * subsets[i];
subsets[i] += arr[idx];
now += subsets[i] * subsets[i];
#ifdef debug
printf("put arr[%d] = %d into %dth subset, nowsum = %lu\n", idx, arr[idx], i, now);
#endif
solve(arr, idx + 1, n, subsets, k, now, minsum);
subsets[i] -= arr[idx];
#ifdef debug
printf("remove arr[%d] = %d from %dth subset\n", idx, arr[idx], i);
#endif
if(!subsets[i])
return;
}
}
int main(){
int n, k;
scanf("%d%d", &n, &k);
int arr[N];
for(int i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
uint64_t subsets[K] = {0};
uint64_t minsum = UINT64_MAX;
solve(arr, 0, n, subsets, k, (uint64_t)0, &minsum);
printf("%lu\n", minsum);
}
```