#include<iostream>
#include<algorithm>
#include<stdint>
using namespace std;

const int MAX = 100001;
int main() {
	int N, M;
	static int A[MAX];
	cin >> N >> M;
	for (int i = 0;i < N;++ i) cin >> A[i];
	static int sum[MAX]; // Aの累積和 ただしmod M上で考える
	sum[0] = A[0] % M;
	for (int i = 1;i < N;++ i) sum[i] = (A[i] + sum[i - 1]) % M;
	sort(sum, sum+N);
	int64_t ans = 0;
	for (int l = 0, r = 0;l < N;r = l > r ? l : r) {
		if (r < N && sum[l] == sum[r]) ++ r; // r < N && 範囲が条件を満たす場合
		else {
			ans += (int64_t)(r - l - (sum[l] == 0 ? -1 : 1)) * (r - l) / 2; // 往々にしてオーバーフローするのでint64_tの検討を
			l = r;
		}
	}
	cout << ans;
	return 0;
}
/*
31536000のコメント解説欄
ここテンプレで用意してるから、A問題とかだとこの先空欄の危険あり
また、コンテスト後に https://31536000.hatenablog.com/ で解説していると思うので、良かったら読んでねー

まず、Mの倍数という条件に注目。
これ、mod M上で考えると良さそうだよね？(xがMの倍数⇔x mod M==0)
そこで全てmod M上で考えると、[l, r]区間がMの倍数であるという条件がA_lからA_rまで全て足すとmod M==0になるという条件に変わった
ここで、A_lからA_rまでの合計が分かっていると計算が楽そう→累積和を使ってみよう
累積和B_i = Σ[k=1, i]A_iとすると、[l, r]区間はΣ[k=l, r]A_i == Σ[k=1, r]A_k - Σ[k=1, l-1]A_k == B_r - B_{l-1}で導出できるね
さて、この時のB_rとB_{l-1}について何が成立すると条件を満たすだろうか？
これは、つまりB_r - B_{l-1} mod M == 0、つまりB_r mod MとB_{l-1} mod Mが等しいということ
逆に、これさえ満たせば全て条件を満たすので、今x個のB_iがmod M上で同値ならば、そのうち任意の2個に対して条件を満たすのでxC2 == (x-1)x/2個が条件を満たす
ただしB_i mod M==0ならば1個でも条件を満たすからxC2+x == x(x+1)/2個が条件を満たすことに注意ね
これはBについてソートしておけば単調性があるので簡単に調べられるよ
なお、最大ケースはN==10^5、全てのA_i==Mの倍数を満たすときで、この時答えは(10^5)(100001)/2=5,000,050,000とint型に収まらないことに注意ね
*/