#include <bits/stdc++.h>   using namespace std;   const int Maxn = 500010;   const int Maxk = 110;   const int Maxp = 110;   const int inf = 2147483647;   int read() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 )       x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();     return x * f;   }   int n, k, p, s[Maxn], f[Maxn][Maxk];   int mn[2][Maxp], v[Maxp];   void modify(int o, int x, int y) {     for (; x <= p; x += (x & -x)) mn[o][x] = min(mn[o][x], y);   }   int query(int o, int x) {     int re = inf;     for (; x; x -= (x & -x)) re = min(re, mn[o][x]);     return re;   }   int main() {     memset(f, 63, sizeof(f));     n = read(), k = read(), p = read();     s[0] = 0;     for (int i = 1; i <= n; i++)       s[i] = (read() % p + s[i - 1]) % p, f[i][1] = s[i];     for (int j = 2; j <= k; j++) {       memset(v, 63, sizeof(v));       memset(mn, 63, sizeof(mn));       v[s[j - 1]] = f[j - 1][j - 1] - s[j - 1];       modify(0, s[j - 1] + 1, v[s[j - 1]]);       modify(1, p - s[j - 1], v[s[j - 1]]);       for (int i = j; i <= n; i++) {         f[i][j] = min(s[i] + query(0, s[i] + 1), s[i] + p + query(1, p - s[i]));         if (f[i][j - 1] - s[i] < v[s[i]]) {           v[s[i]] = f[i][j - 1] - s[i];           modify(0, s[i] + 1, v[s[i]]);           modify(1, p - s[i], v[s[i]]);         }       }     }     printf( %d , f[n][k]);   }   