![](https://img-blog.csdnimg.cn/direct/b6cb4aba5f8a423e9c7606ec68b98a12.png)
![](https://img-blog.csdnimg.cn/direct/e2cfa30a87794a94b16e3ce4f7b7ecdb.png)
![](https://img-blog.csdnimg.cn/direct/0e920c2f364f4416bb4a7002ca34ef4c.png)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int main()
{
int ans = 0;
int n, k;cin >> n >> k;
map<int,int>M;
/*
如果m能被k整除,说明m本身就是k的倍数,直接将答案ans加1。
否则,计算m除以k的余数p。
如果哈希表中存在键为k-p的元素且其值大于0
说明之前已经出现过一个与当前整数相加能够被k整除的整数
将答案ans加1,并将哈希表中键为k-p的元素的值减1。如果哈希表中不存在键为k-p的元素或其值为0
说明当前整数无法与之前的整数相加得到一个能被k整除的整数
将哈希表中键为p的元素的值加1。
*/
for(int i = 1;i <= n;i++)
{
int m;cin >> m;
if(m % k == 0)ans++;
else
{
int p = m % k;
if(M[k - p] > 0)
{
ans++;
M[k - p]--;
}
else
M[m % k]++;
}
}
cout << ans << endl;
return 0;
}