#include #include #include #include using namespace std; map, int> cache; int k; int solve(vector& v) { if(cache.contains(v)) { return cache[v]; } int best = 0; int m = k - 1; while(v[m] == 0) --m; v[m] -= 1; for(int i = 1; i <= m; ++i) { if(v[i] == 0) continue; --v[i]; int a = 0; if(m + i != k) { ++v[(m + i) % k]; } else { ++a; } a += solve(v); if(m + i != k) { --v[(m + i) % k]; } best = max(best, a); ++v[i]; } v[m] += 1; return cache[v] = best; } int main() { int n; cin >> n >> k; int sum = 0; vector cnt(k); int ans = 0; for(int i = 0; i < n; ++i) { int x; cin >> x; sum += x; if(x % k == 0) { ++ans; } else { cnt[x % k] += 1; } } // opposite pairs for(int i = 1; 2 * i < k; ++i) { auto x = min(cnt[i], cnt[k - i]); cnt[i] -= x; cnt[k - i] -= x; ans += x; } if(k % 2 == 0) { ans += cnt[k / 2] / 2; cnt[k / 2] %= 2; } cache[vector(k, 0)] = 0; cout << sum / k - ans - solve(cnt) << endl; }