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# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Linq;
using System.Collections.Generic;
class P
{
    static void Main()
    {
        int m = Console.ReadLine().Split().Select(int.Parse).ToArray()[1];
        int[] a = Console.ReadLine().Split().Select(int.Parse).OrderBy(x => x).ToArray();
        int[] moda = new int[m];
        int[] paircount = new int[m];
        int res = 0;
        int last = -10;
        for (int i = 0; i < a.Length; i++)
        {
            if (last == a[i])
            {
                paircount[a[i] % m]++;
            }
            moda[a[i] % m]++;
            last = a[i];
        }

        if (m % 2 == 0)
        {
            res += moda[m / 2 + 1] / 2;
        }
        res += moda[0] / 2;
        
        for (int i = 0; i < m / 2 - (m % 2 == 0 ? 1 : 0); i++)
        {
            res += Math.Min(moda[i + 1], moda[m - i - 1]);
            res += Math.Min((moda[i + 1] > moda[m - i - 1] ? paircount[i + 1] : paircount[m - i - 1]) ,Math.Abs(moda[i + 1] - moda[m - i - 1]) / 2);
            //Console.WriteLine(res);
        }
        Console.WriteLine(res);
    }
}