#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 233;
const int INF = numeric_limits<int>::max();
void read(int &x) {
  x = 0;
  char ch = getchar();
  int f = 1;
  while (!isdigit(ch)) (ch == '-' ? f = -1 : 0), ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
int f[N][105], g[105];
int n, K, p, a[N], nw, s[N];
int x, sum, st[N], tp;
signed main() {
  memset(g, 0x7f, sizeof(g));
  memset(f, 0x7f, sizeof(f));
  read(n);
  read(K);
  read(p);
  if (p * K > n) {
    for (int i = 1; i <= n; ++i) {
      read(x);
      x %= p;
      a[i] = x;
      sum = (sum + a[i]) % p;
      f[i][1] = sum;
      g[1] = sum;
      for (int j = min(K, i); j >= 2; --j)
        if (i == j) {
          f[i][j] = f[i - 1][j - 1] + x;
          g[j] = x;
        } else {
          int l = f[i - 1][j - 1] + x;
          int r = f[i - 1][j] + x;
          if (g[j] + x >= p) r -= p;
          if (l < r)
            f[i][j] = l, g[j] = x;
          else if (l > r)
            f[i][j] = r, g[j] = (g[j] + x) % p;
          else
            f[i][j] = l, g[j] = max(x, (g[j] + x) % p);
        }
    }
    return printf("%d", f[n][K]), 0;
  }
  for (int i = 1; i <= n; ++i)
    read(a[i]), a[i] %= p, sum += a[i], s[i] = (s[i - 1] + a[i]) % p;
  for (int i = 1; i <= n - 1; ++i) {
    int pos = upper_bound(st + 1, st + 1 + tp, s[i]) - st;
    if (pos > tp) ++tp;
    st[pos] = s[i];
  }
  int pos = upper_bound(st + 1, st + 1 + tp, s[n]) - st;
  if (pos >= K)
    printf("%d", s[n]);
  else
    printf("%d", s[n] + p);
  return 0;
}
