func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, k, p;   int dp[111][555555], cur[111], a[555555], ld[111], sum[555555], dpp[555555],       bit[1111], sz;   void update(int x, int p) {     while (x <= sz) {       bit[x] = max(bit[x], p);       x += x & (-x);     }   }   int query(int x) {     int res = 0;     while (x >= 1) {       res = max(res, bit[x]);       x -= x & (-x);     }     return res;   }   int main() {     scanf( %d%d%d , &n, &k, &p);     for (int i = 1; i <= n; i++) {       scanf( %d , &a[i]);       a[i] %= p;     }     if (k * p >= n) {       for (int i = 0; i <= k; i++) {         for (int j = 0; j <= n; j++) dp[i][j] = 1e9;       }       dp[0][0] = 0;       for (int i = 1; i <= k; i++) {         for (int j = 0; j < p; j++) cur[j] = 1e9;         for (int j = 1; j <= n; j++) {           for (int h = 0; h < p; h++) ld[(h + a[j]) % p] = cur[h];           for (int h = 0; h < p; h++) cur[h] = ld[h];           cur[a[j]] = min(cur[a[j]], dp[i - 1][j - 1]);           for (int h = 0; h < p; h++) dp[i][j] = min(dp[i][j], cur[h] + h);         }       }       cout << dp[k][n] << endl;     } else {       for (int i = 1; i <= n; i++) sum[i] = (sum[i - 1] + a[i]) % p;       sz = 1;       while (sz < p) sz *= 2;       for (int i = 1; i <= n; i++) {         dpp[i] = query(sum[i] + 1) + 1;         update(sum[i] + 1, dpp[i]);       }       if (dpp[n] >= k)         cout << sum[n] << endl;       else         cout << sum[n] + p << endl;     }     return 0;   }   