Problem:
Score : 700 points

Problem Statement

Takahashi is playing with N cards.

The i-th card has an integer X_i on it.

Takahashi is trying to create as many pairs of cards as possible satisfying one of the following conditions:

The integers on the two cards are the same.

The sum of the integers on the two cards is a multiple of M.

Find the maximum number of pairs that can be created.

Note that a card cannot be used in more than one pair.

Constraints

2≦N≦10^5

1≦M≦10^5

1≦X_i≦10^5

Input

The input is given from Standard Input in the following format:

N M
X_1 X_2 ... X_N

Output

Print the maximum number of pairs that can be created.

Sample Input 1

7 5
3 1 4 1 5 9 2

Sample Output 1

3

Three pairs (3,2), (1,4) and (1,9) can be created.

It is possible to create pairs (3,2) and (1,1), but the number of pairs is not maximized with this.

Sample Input 2

15 10
1 5 6 10 11 11 11 20 21 25 25 26 99 99 99

Sample Output 2

6

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<cstdio>
#include<cmath>
#include<deque>
#include<numeric>
#include<queue>
#include<stack>
#include<cstring>
#include<limits>
#include<functional>
#include<unordered_set>
#include<iomanip>
#include<cassert>
#include<regex>
#include<bitset>
#include<complex>
#include<chrono>
#include<random>
#define rep(i,a) for(int i=(int)0;i<(int)a;++i)
#define pb push_back
#define eb emplace_back
#define all(x) x.begin(),x.end()
using ll=long long;
constexpr ll mod = 1e9 + 7;
constexpr ll INF = 1LL << 60;

ll gcd(ll n, ll m) {
	ll tmp;
	while (m!=0) {
		tmp = n % m;
		n = m;
		m = tmp;
	}
	return n;
}

ll lcm(ll n, ll m) {
	return abs(n) / gcd(n, m)*abs(m);//gl=xy
}
 
template<class T> inline bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}
 
using namespace std;


void solve(){
  int n,m;
  cin>>n>>m;
  vector<int>x(n);
  map<int,int>mp,mp2;
  map<int,int>s,t;
  vector<int>v(1e5+10);
  rep(i,n)cin>>x[i],mp[x[i]%m]++,v[x[i]]++;
  rep(i,1e5+5){
    if(v[i]>=2)mp2[i%m]++;
  }
  int ans=0;
  for(auto x: mp){
    if((x.first==0)||(2*x.first==m))continue;
    if(s.count(x.first)||t.count(x.first))continue;
    if(mp[x.first]>=mp[(m-x.first)%m]){
      s[x.first]=mp[x.first];
      t[(m-x.first)%m]=mp[(m-x.first)%m];
    }
    else{
      t[x.first]=mp[x.first];
      s[(m-x.first)%m]=mp[(m-x.first)%m];
    }
  }
  for(auto x:s){
    ans+=t[(m-x.first)%m];
    ans+=min((s[x.first]-t[(m-x.first)%m])/2,mp2[x.first]);
  }
  ans+=mp[0]/2;
  if(m%2==0){
    ans+=mp[m/2]/2;
  }
  cout<<ans;
}

int main(){
	ios::sync_with_stdio(false);
  cin.tie(0);
	cout<<fixed<<setprecision(15);
  solve();
	return 0;
}