#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
mt19937 Random(int(time(0)));
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
const int P = 239017;
const long long BINF = 1e18 + 10;
const long double EPS = 1e-6;
int t1[110], t2[110], dp[110][500010], mod, arr[500010];
inline void upd1(int v, int val) {
  for (; v <= mod; v += v & (-v)) {
    t1[v] = min(t1[v], val);
  }
}
inline void upd2(int v, int val) {
  for (; v <= mod; v += v & (-v)) {
    t2[v] = min(t2[v], val);
  }
}
inline int get_min1(int v) {
  int res = INF;
  for (; v > 0; v -= v & (-v)) {
    res = min(res, t1[v]);
  }
  return res;
}
inline int get_min2(int v) {
  int res = INF;
  for (; v > 0; v -= v & (-v)) {
    res = min(res, t2[v]);
  }
  return res;
}
inline void source() {
  int n, k;
  cin >> n >> k >> mod;
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    arr[i] = (arr[i - 1] + a) % mod;
  }
  for (int i = 0; i <= k; i++) {
    for (int j = 0; j <= n; j++) {
      dp[i][j] = INF;
    }
  }
  dp[0][0] = 0;
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= mod; j++) {
      t1[j] = INF;
      t2[j] = INF;
    }
    upd1(1, dp[i - 1][0] + mod);
    upd2(mod, dp[i - 1][0] + mod);
    for (int j = 1; j <= n; j++) {
      dp[i][j] = min(get_min1(arr[j] + 1) - mod + arr[j],
                     get_min2(mod - arr[j] - 1) + arr[j]);
      upd1(arr[j] + 1, dp[i - 1][j] + mod - arr[j]);
      upd2(mod - arr[j], dp[i - 1][j] + mod - arr[j]);
    }
  }
  cout << dp[k][n];
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  source();
  return 0;
}
