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: Wrong Answer)

using System;

    public class Program
    {
        public static void Main(string[] args)
        {
            string[] input=Console.ReadLine().Split(' ');
            int n=int.Parse(input[0]);
            int m=int.Parse(input[1]);
            int max=0;
            int ans=0;
            int Z=0;
            int[] NUM=new int[120000];
            int[] MOD1=new int[120000];
            int[] MOD2=new int[120000];
            string[] ip2=Console.ReadLine().Split(' ');
            for (int i=0;i<n;i++)
            {
                if (int.Parse(ip2[i])>max) max=int.Parse(ip2[i]);
                NUM[int.Parse(ip2[i])]++;
            }
            for (int i=1;i<=max;i++)
            {
                if (NUM[i]==1) MOD1[i%m]++;
                if (NUM[i]>1) MOD2[i%m]=MOD2[i%m]+NUM[i];
            }
            for (int i=1;i<(m+1)/2;i++)
            {
                if (MOD1[i]+MOD2[i]>MOD1[m-i]+MOD2[m-i])
                {
                    ans=ans+MOD1[m-i]+MOD2[m-i];
                    if (MOD1[i]>MOD1[m-i]+MOD2[m-i]) Z=0;
                    else Z=MOD1[m-i]+MOD2[m-i]-MOD1[i];
                    ans=ans+(MOD2[i]-Z)/2;
                }
                else
                {
                    ans=ans+MOD1[i]+MOD2[i];
                    if (MOD1[m-i]>MOD1[i]+MOD2[i]) Z=0;
                    else Z=MOD1[i]+MOD2[i]-MOD1[m-i];
                    ans=ans+(MOD2[m-i]-Z)/2;
                }
            }
            if (m%2==0) ans=ans+(MOD1[m%2]+MOD2[m%2])/2;
            ans=ans+(MOD1[0]+MOD2[0])/2;
            Console.WriteLine(ans);
        }
    }