题目传送门:http://codeforces.com/contest/1133/problem/B
题意:给出一组数, 求最多能找出几对和为k的倍数的数。
解:思路就是构建一个mod k的剩余系,之后遍历一半的数组就可以了。注意判断相等的时候。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
int a[200005];
int main()
{
int n, k;
while(cin >> n >> k)
{
memset(a, 0, sizeof(a));
int x;
for(int i = 1; i <= n; ++i)
{
cin >> x;
a[x%k]++;
}
int ans = a[0] / 2;
for(int i = 1; i < k / 2 + 1; ++i)
{
if(a[i%k] != a[k-i%k])
ans += min(a[i%k], a[k-i%k]);
else if(i%k == k - i%k)
ans += a[i%k] / 2;
else if(a[i%k] == a[k-i%k])
ans += a[i%k];
a[i%k] = a[k-i%k] = 0;
}
cout << ans * 2 << '\n';
}
return 0;
}