#include <bits/stdc++.h>   using namespace std;   const int N = 5e5 + 233;   const int INF = numeric_limits<int>::max();   void read(int &x) {     x = 0;     char ch = getchar();     int f = 1;     while (!isdigit(ch)) (ch ==  -  ? f = -1 : 0), ch = getchar();     while (isdigit(ch)) x = x * 10 + ch -  0 , ch = getchar();     x *= f;   }   int f[N][105], g[105];   int n, K, p, a[N], nw, s[N];   int x, sum, st[N], tp;   signed main() {     memset(g, 0x7f, sizeof(g));     memset(f, 0x7f, sizeof(f));     read(n);     read(K);     read(p);     if (p * K > n) {       for (int i = 1; i <= n; ++i) {         read(x);         x %= p;         a[i] = x;         sum = (sum + a[i]) % p;         f[i][1] = sum;         g[1] = sum;         for (int j = min(K, i); j >= 2; --j)           if (i == j) {             f[i][j] = f[i - 1][j - 1] + x;             g[j] = x;           } else {             int l = f[i - 1][j - 1] + x;             int r = f[i - 1][j] + x;             if (g[j] + x >= p) r -= p;             if (l < r)               f[i][j] = l, g[j] = x;             else if (l > r)               f[i][j] = r, g[j] = (g[j] + x) % p;             else               f[i][j] = l, g[j] = max(x, (g[j] + x) % p);           }       }       return printf( %d , f[n][K]), 0;     }     for (int i = 1; i <= n; ++i)       read(a[i]), a[i] %= p, sum += a[i], s[i] = (s[i - 1] + a[i]) % p;     for (int i = 1; i <= n - 1; ++i) {       int pos = upper_bound(st + 1, st + 1 + tp, s[i]) - st;       if (pos > tp) ++tp;       st[pos] = s[i];     }     int pos = upper_bound(st + 1, st + 1 + tp, s[n]) - st;     if (pos >= K)       printf( %d , s[n]);     else       printf( %d , s[n] + p);     return 0;   }   