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 <bits/stdc++.h>
#define pt(sth) cout << sth << "\n"
#define chmax(a, b) {if(a<b) a=b;}
#define chmin(a, b) {if(a>b) a=b;}
#define moC(a, s, b) (a)=((a)s(b)+MOD)%MOD
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
static const ll INF=1e18;
static const ll MAX=101010;
static const ll MOD=1e9+7;




int main(void) {
  ll N, M;
  cin >> N >> M;
  ll i, j;
  ll x[MAX];
  vector<ll> v[MAX];
  for(i=0; i<N; i++) {
    cin >> x[i];
    v[x[i]%M].push_back(x[i]);
  }
  
  for(i=0; i<M; i++) {
    v[i].push_back(INF);
    sort(v[i].begin(), v[i].end());
  }
  
  vector<ll> cnt[MAX];
  for(i=0; i<M; i++) {
    for(j=0; j<v[i].size(); j++) {
      ll t=1;
      while(v[i][j]==v[i][j+1]) {
        t++;
        j++;
      }
      cnt[i].push_back(t);
    }
    sort(cnt[i].begin(), cnt[i].end());
  }
  
  for(i=0; i<M; i++) cnt[i].erase(cnt[i].begin());
  
  ll s[MAX]={};
  ll odd[MAX]={};
  for(i=0; i<M; i++) {
    ll t=0;
    for(j=0; j<cnt[i].size(); j++) {
      t+=cnt[i][j];
      if(cnt[i][j]&1) odd[i]++;
    }
    s[i]=t;
  }
  
  ll ans=s[0]/2;
  if(M%2==0) ans+=s[M/2]/2;
  
  for(i=1; i<=M/2-(M&1 ? 0:1); i++) {
    ll a=i;
    ll b=M-i;
    
    if(s[a]>s[b]) swap(a, b);
    
    if(s[a]>=odd[b]) {
      ans+=s[a]+(s[b]-s[a])/2;
    }else {
      ans+=s[a]+(s[b]-(odd[b]-s[a]))/2;
    }
    
  }
  
  pt(ans);
}