#include <bits/stdc++.h>
#pragma GCC optimization("O3")
using namespace std;
template <typename T>
inline void Cin(T& first) {
  char c;
  T sign = 1;
  first = 0;
  for (c = getchar(); c < '0' || c > '9'; c = getchar())
    if (c == '-') sign = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) first = first * 10 + c - '0';
  first *= sign;
}
template <typename T>
inline void Out(T first) {
  if (first > 9) Out(first / 10);
  putchar(first % 10 + '0');
}
template <typename T>
inline void Cout(T first, char c) {
  if (first < 0) putchar('-');
  first = abs(first);
  Out(first);
  putchar(c);
}
template <typename T, typename... Args>
inline void Cin(T& a, Args&... args) {
  Cin(a);
  Cin(args...);
}
template <typename T, typename... Args>
inline void Cout(T a, char c, Args... args) {
  Cout(a, c);
  Cout(args...);
}
const int N = int(5e5) + 7;
int n, k, p;
vector<int> f, g, a;
struct TFenwick {
  int n;
  vector<int> v;
  TFenwick(int n = 0) : n(n) {
    v.resize(n + 1);
    fill(v.begin(), v.end(), int(1e9));
  }
  void Reset() { fill(v.begin(), v.end(), int(1e9)); }
  void Update(int first, int second) {
    for (; first <= n; first += (first & -first))
      v[first] = min(v[first], second);
  }
  int Query(int first) {
    int res = int(1e9);
    for (; first > 0; first -= (first & -first)) res = min(res, v[first]);
    return res;
  }
} bit, rev;
void Enter() {
  cin >> n >> k >> p;
  a.resize(n + 1);
  a[0] = 0;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    a[i] = (a[i - 1] + a[i]) % p;
  }
}
void Solve() {
  f.resize(n + 1);
  g.resize(n + 1);
  fill(g.begin(), g.end(), int(1e9));
  g[0] = 0;
  bit = TFenwick(p), rev = TFenwick(p);
  for (int j = 1; j <= k; ++j) {
    fill(f.begin(), f.end(), int(1e9));
    bit.Reset();
    rev.Reset();
    for (int i = 0; i < j; ++i) {
      bit.Update(a[i] + 1, g[i] - a[i]);
      rev.Update(p - a[i], g[i] - a[i] + p);
    }
    for (int i = j; i <= n; ++i) {
      f[i] = min(bit.Query(a[i] + 1), rev.Query(p - 1 - a[i])) + a[i];
      bit.Update(a[i] + 1, g[i] - a[i]);
      rev.Update(p - a[i], g[i] - a[i] + p);
    }
    g = f;
  }
  cout << f[n];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  if (fopen("test"
            ".inp",
            "r")) {
    freopen(
        "test"
        ".inp",
        "r", stdin);
    freopen(
        "test"
        ".out",
        "w", stdout);
  }
  Enter(), Solve();
  return 0;
}
