// ovaj kod vremenske slozenosti N * M * M resava podzadatke 1, 2 i 4. Podzadatak 3 ne resava jer nisu data slabija ogranicenja za N i M, vec samo za a_i

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long n, m;
    scanf("%lld %lld", &n, &m);
    
    vector<long long> a(n);
    for (long long &x : a)
        scanf("%lld", &x);

    // dp[broj_gostiju_mod_m][pokloni_mod_m] = max broj poklona
    vector<vector<long long>> dp(m, vector<long long>(m, -1e18));
    dp[0][0] = 0;

    for (int i = 0; i < n; i++) {
        vector<vector<long long>> novo = dp; // kopija prethodnog stanja
        for (int j = 0; j < m; j++) {
            for (int k = 0; k < m; k++) {
                long long novi_j = (j + 1) % m;
                long long novi_k = (k + a[i]) % m;
                novo[novi_j][novi_k] = max(novo[novi_j][novi_k], dp[j][k] + a[i]);
                // memoriju jesmo smanjili kopiranjem, ali je vreme i dalje ostalo N * M * M
            }
        }
        dp = move(novo);
    }
    
    printf("%lld", dp[0][0]);
    
    return 0;
}