    using System;
    class Program
    {
        static void Main(string[] args)
        {

            // 入力
            String[] line1 = Console.ReadLine().Split(' ');
            int N = int.Parse(line1[0]);
            int M = int.Parse(line1[1]);
            String[] line2 = Console.ReadLine().Split(' ');
            int Anum = line2.Length;
            long[] A = new long[Anum];
            for (int i = 0; i < Anum; i++)
            {
                A[i] = int.Parse(line2[i]);
            }

            //たぶん世の中、配列の合計と言われたら、足し上げた数列を作るものなんだろう
            long[] B = new long[Anum + 1];
            B[0] = 0;
            for (int i = 1; i < Anum + 1; i++)
            {
                B[i] = B[i - 1] + A[i - 1];
            }

            //解説をみるに複雑なんですね・・・
            //二つの組み合わせにするとすぐに駄目になるから、一つずつで計算して、カウントだけするんですね。
            //完全に天才の発想にしか感じない
            System.Collections.Generic.Dictionary<int,int> HT = new System.Collections.Generic.Dictionary<int, int>();

            int[] Bmod = new int[Anum + 1];
            for (int i = 0; i < Anum + 1; i++)
            {
                Bmod[i] = (int)(B[i] % M);
                if (HT.ContainsKey(Bmod[i]) == false)
                {
                    HT.Add(Bmod[i], 0);
                }
                HT[Bmod[i]] += 1;
            }

            //Console.WriteLine("^^");
            long goukei = 0;

            System.Collections.Generic.Dictionary<int,int>.KeyCollection KL = HT.Keys;
            foreach(int i in KL)
            {
                    goukei += HT[i] * (HT[i] - 1) / 2;
            }


            //for (int i=0; i < M; i++)
            //{
            //    if (HT.ContainsKey(i) == true)
            //    {
            //    }
            //}
            

            //出力
            //String result = "";
            Console.WriteLine(goukei);






            //System.Threading.Thread.Sleep(5000);

        }
    }