#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector> 
#include<limits>
#include<numeric>
#include<type_traits>
#include<math.h>
#include<fstream>
#include<set>
using namespace std;
typedef long long ll;

#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define repi(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define out(str) cout << str << endl
#define ALL(a) (a).begin(),(a).end()
#define INF (1<<29)

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

ll v[100100][100100];

void ncr(ll n){
    for(int i=0;i<n+1;i++){
        for(int j=0;j<=i;j++){
            if(j==0||j==i){
                v[i][j]=1;
            }
            else{
                v[i][j]=v[i-1][j-1]+v[i-1][j];
            }
        }
    }
    return ;
}

ll N,M,ans=0,cnt,now;

int main(){
    cin>>N>>M;
    ll A[N];
    ncr(N);
    rep(i,N){
        cin>>A[i];
        A[i]=A[i]%M;
    }
    rep(i,N-1){
        A[i+1]=(A[i+1]+A[i])%M;
    }
    sort(A,A+N);
    now=0;
    cnt=1;
    rep(i,N){
        if(now==A[i]){
            cnt++;
        }
        else{
            // printf("cnt : %lld\n",cnt);
            if(cnt>1)ans+=v[cnt][2];
            // out(ans);
            cnt=1;
            now=A[i];
        }
    }
    if(cnt>1)ans+=v[cnt][2];
    // rep(i,N){
    //     printf("%lld ",A[i]);
    // }
    // out("");
    out(ans);
    

}
