#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 500005;
int n_, dat[300];
inline void init() { memset(dat, 0x3f3f3f3f, sizeof(dat)); }
inline void update(int k, int a) {
  k += n_;
  dat[k] = a;
  while (k > 0) {
    k >>= 1;
    dat[k] = min(dat[2 * k], dat[2 * k + 1]);
  }
}
inline int query(int a, int b, int k = 0, int l = 0, int r = n_) {
  int res1 = 0x3f3f3f3f, res2 = 0x3f3f3f3f;
  a += n_, b += n_;
  while (a != b) {
    if (a % 2) res1 = min(res1, dat[a++]);
    if (b % 2) res2 = min(res2, dat[--b]);
    a >>= 1, b >>= 1;
  }
  return min(res1, res2);
}
int v[500001], a[500001], s[500002];
int mn[101];
int main() {
  int n, K, p;
  scanf("%d%d%d", &n, &K, &p);
  for (int i = 0; i < (int)(n); ++i) {
    scanf("%d", &a[i]);
  }
  for (int i = 0; i < (int)(n); ++i) {
    s[i + 1] = (s[i] + a[i]) % p;
  }
  n_ = 1;
  while (n_ < p) {
    n_ *= 2;
  }
  memset(v, 0x3f3f3f3f, sizeof(v));
  v[0] = 0;
  for (int j = (int)(1); j < (int)(K); ++j) {
    init();
    memset(mn, 0x3f3f3f3f, sizeof(mn));
    int mnn = 0x3f3f3f3f;
    for (int i = (int)(j - 1); i < (int)(n - 1); ++i) {
      if (v[i - j + 1] < mn[s[i]]) {
        update(s[i], v[i - j + 1]);
        mn[s[i]] = v[i - j + 1];
        mnn = min(mnn, mn[s[i]]);
      }
      int u = query(0, s[i + 1] + 1), w = mnn + p;
      v[i - j + 1] = u < w ? u : w;
    }
  }
  init();
  memset(mn, 0x3f3f3f3f, sizeof(mn));
  int mnn = 0x3f3f3f3f;
  for (int i = (int)(K - 1); i < (int)(n); ++i) {
    if (v[i - K + 1] < mn[s[i]]) {
      update(s[i], v[i - K + 1]);
      mn[s[i]] = v[i - K + 1];
      mnn = min(mnn, mn[s[i]]);
    }
    v[i - K + 1] = min(query(0, s[i + 1] + 1), mnn + p);
  }
  printf("%d\n", v[n - K] + s[n] % p);
  return 0;
}
