#include #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 cnt = 100; int m = 0; for(int i = 1; i < k; ++i) { if(v[i] > 0 && v[i] < cnt) m = i, cnt = v[i]; } assert(v[m] > 0); v[m] -= 1; for(int i = 1; i <= k; ++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; }