#include <bits/stdc++.h>
using namespace std;
int bit[201][2];
int n, k, p;
int a[600001];
int b[600001], s[600001];
int c[600001];
int lowbit(int x) { return (x & -x); }
int min(int a, int b) { return (a > b ? b : a); }
void insertPrefix(int val, int pos, int tree) {
  for (int i = pos; i <= p; i += lowbit(i)) {
    bit[i][tree] = min(bit[i][tree], val);
  }
}
int queryPrefix(int pos, int tree) {
  int val = 1e9;
  for (int i = pos; i; i -= lowbit(i)) {
    val = min(val, bit[i][tree]);
  }
  return val;
}
void insert(int v, int pos) {
  insertPrefix(v + p - pos, pos, 0);
  insertPrefix(v + p - pos, p - pos + 1, 1);
}
int main() {
  scanf("%d%d%d", &n, &k, &p);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    a[i] %= p;
  }
  for (int i = 1; i <= n; i++) {
    s[i] = (s[i - 1] + a[i]) % p;
    b[i] = s[i];
  }
  for (int i = 1; i <= k - 1; i++) {
    for (int j = 1; j <= p; j++) bit[j][0] = bit[j][1] = 1e9;
    for (int j = 1; j <= i; j++) {
      c[j] = 1e9;
      insert(b[j], s[j] + 1);
    }
    for (int j = i + 1; j <= n; j++) {
      int zeroPoint = s[j] + 1;
      int len = p - zeroPoint;
      int val = min(queryPrefix(zeroPoint, 0) - p + zeroPoint,
                    queryPrefix(len, 1) + zeroPoint);
      c[j] = val;
      insert(b[j], s[j] + 1);
    }
    for (int j = 1; j <= n; j++) b[j] = c[j];
  }
  printf("%d\n", b[n]);
}
