#include <bits/stdc++.h>
using namespace std;
const int maxn = 500010, inf = 0x7fffffff;
int n, k, p, sum[maxn], f[110], c1[110][110], c2[110][110];
void update1(int x, int y, int v) {
  y++;
  while (y <= p + 1) {
    c1[x][y] = min(c1[x][y], v);
    y += y & (-y);
  }
}
void update2(int x, int y, int v) {
  y++;
  while (y) {
    c2[x][y] = min(c2[x][y], v);
    y -= y & (-y);
  }
}
int query1(int x, int y) {
  int res = inf;
  y++;
  while (y) {
    res = min(c1[x][y], res);
    y -= y & (-y);
  }
  return res;
}
int query2(int x, int y) {
  int res = inf;
  y++;
  while (y <= p + 1) {
    res = min(res, c2[x][y]);
    y += y & (-y);
  }
  return res;
}
int main() {
  scanf("%d%d%d", &n, &k, &p);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &sum[i]);
    sum[i] += sum[i - 1];
    sum[i] %= p;
  }
  for (int i = 1; i <= k; i++)
    for (int j = 1; j <= p + 1; j++) c1[i][j] = c2[i][j] = inf;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= min(i, k); j++)
      f[j] = min(query1(j - 1, sum[i]), query2(j - 1, sum[i])) + sum[i];
    for (int j = 1; j <= min(i, k); j++) {
      update1(j, sum[i], f[j] - sum[i]);
      update2(j, sum[i], f[j] + p - sum[i]);
    }
  }
  printf("%d\n", f[k]);
  return 0;
}
