#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long INFF = 0x3f3f3f3f3f3f3f3fll;
const long long M = 1e9 + 7;
const long long maxn = 2e5 + 7;
const double eps = 0.00000001;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
template <typename T>
inline T abs(T a) {
  return a > 0 ? a : -a;
}
template <typename T>
inline T powMM(T a, T b) {
  T ret = 1;
  for (; b; b >>= 1ll, a = (long long)a * a % M)
    if (b & 1) ret = (long long)ret * a % M;
  return ret;
}
int A[20007];
int dp[57][107][2];
inline void update(int &x, int y) { x = max(x, y); }
int main() {
  int i, j, l;
  int n, k, p;
  int now = 0;
  scanf("%d%d%d", &n, &k, &p);
  for (i = 1; i <= n; i++) scanf("%d", &A[i]);
  for (j = 1; j <= k; j++)
    for (l = 0; l < p; l++) dp[j][l][now] = -INF;
  dp[1][0][now] = 0;
  for (i = 1; i <= n; i++) {
    now ^= 1;
    for (j = 1; j <= k; j++)
      for (l = 0; l < p; l++) dp[j][l][now] = -INF;
    for (j = 1; j <= k; j++) {
      for (l = 0; l < p; l++) {
        update(dp[j][(l + A[i]) % p][now], dp[j][l][now ^ 1]);
        update(dp[j + 1][0][now], dp[j][l][now ^ 1] + (l + A[i]) % p);
      }
    }
  }
  int ans = 0;
  for (l = 0; l < p; l++) ans = max(ans, dp[k][l][now] + l);
  printf("%d\n", ans);
  return 0;
}
