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 <vector>
#include <map>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <bitset>
#include <time.h>
#include <set>
#include <algorithm>
#define MAXN 100000
#define ll long long
using namespace std;

int counts[MAXN+2];

// 1,1,2,2,3,3,5
// 1,2,3,3,4,4,5


vector<int> nums[MAXN+2];
int pairs[MAXN+2];


int main() {
    int N,M;
    cin>>N>>M;

    for(int i=1;i<=N;i++)
    {
        int x;
        cin>>x;
        nums[x%M].push_back(x);
    }
    
    for(int i=0;i<M;i++) {
        sort(nums[i].begin(),nums[i].end());
        pairs[i]=0;
        for(int j=0;j<(int)nums[i].size()-1;) {
            if (nums[i][j]==nums[i][j+1]) {
                pairs[i]++;
                j+=2;
            } else {
                j++;
            }
        }
    }
    
    
    int answer = 0;
    for(int i=0;i<M;i++) {
        if (i > M-i)
            break;
        
        
        if (i==0 || (i*2)%M==0) {
            answer += nums[i].size()/2;
        } else {
            if (nums[i].size() > nums[M-i].size()) {
                answer += nums[M-i].size();
                int left = nums[i].size()-nums[M-i].size();
                if (left%2)
                    left--;
                answer += min(left/2,pairs[M-i]);
            } else {
                answer += nums[i].size();
                int left = nums[M-i].size()-nums[i].size();
                if (left%2)
                    left--;
                answer += min(left/2,pairs[i]);
            }
        }
    }
    
    cout << answer << endl;
    
    
    
    
}