#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline void print(int x) {
  write(x);
  printf(" ");
}
int s1[2][110];
int s[510000], n, K, mod;
inline void _min(int &x, int y) { x = x < y ? x : y; }
inline void ad(int &x, int y) {
  x += y;
  if (x > mod) x -= mod;
}
inline int lowbit(int x) { return x & -x; }
inline void change(int x, int c, int op) {
  for (; x <= mod; x += lowbit(x)) _min(s1[op][x], c);
}
inline int findmin(int x, int op) {
  int ret = 2147483647;
  for (; x >= 1; x -= lowbit(x)) _min(ret, s1[op][x]);
  return ret;
}
int f[110][510000];
int val[110];
int main() {
  n = read();
  K = read();
  mod = read();
  memset(f, 63, sizeof(f));
  for (int i = 1; i <= n; i++) {
    s[i] = (read() % mod + s[i - 1]) % mod;
    f[1][i] = s[i];
  }
  for (register int k = 2; k <= K; k++) {
    memset(s1, 63, sizeof(s1));
    memset(val, 63, sizeof(val));
    val[s[k - 1]] = f[k - 1][k - 1] - s[k - 1];
    change(s[k - 1] + 1, val[s[k - 1]], 0);
    change(mod - s[k - 1], val[s[k - 1]], 1);
    for (register int i = k; i <= n; i++) {
      int g1 = findmin(s[i] + 1, 0), g2 = findmin(mod - s[i], 1);
      _min(f[k][i], min(s[i] + g1, s[i] + mod + g2));
      if (val[s[i]] > f[k - 1][i] - s[i]) {
        val[s[i]] = f[k - 1][i] - s[i];
        change(s[i] + 1, val[s[i]], 0);
        change(mod - s[i], val[s[i]], 1);
      }
    }
  }
  printf("%d\n", f[K][n]);
  return 0;
}
