#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:667772160")
using namespace std;
struct __isoff {
  __isoff() {
    if (0) freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
    srand(time(0));
  }
  ~__isoff() {}
} __osafwf;
const unsigned long long p1 = 31;
const unsigned long long p2 = 29;
const double eps = 1e-8;
const double pi = acos(-1.0);
const long long inf = 1e18 + 7;
const int infi = 1e9 + 7;
const long long dd = 1e6 + 70;
const long long mod = 1e9 + 7;
int n, k;
vector<int> P[dd];
vector<int> T(1);
vector<pair<int, int> > Z;
bool Bs[dd];
int get(int l, int r, int x) {
  return upper_bound(P[x].begin(), P[x].end(), r) -
         lower_bound(P[x].begin(), P[x].end(), l);
}
set<int> Q, W;
int main() {
  cin >> n >> k;
  long long s = 0;
  P[0].push_back(0);
  for (long long i = 0; i < (long long)n; i++) {
    int t;
    scanf("%d", &t);
    Z.push_back(make_pair(-t, i));
    s = (s + t) % k;
    T.push_back(s);
    P[s].push_back(i + 1);
  }
  sort(Z.begin(), Z.end());
  Bs[0] = Bs[n] = 1;
  long long res = 0;
  Q.insert(-1);
  Q.insert(n);
  W.insert(1);
  W.insert(-n);
  for (long long i = 0; i < (long long)n; i++) {
    int t = Z[i].second;
    int r = *Q.lower_bound(t);
    int l = -(*W.lower_bound(-t));
    if (t - l < r - t) {
      for (int j = l + 1; j <= t; j++) {
        int z = max(j + 2, t + 1);
        int ts = (T[j] - Z[i].first) % k;
        int tt = get(z, r, ts);
        res += tt;
      }
    } else {
      for (int j = t + 1; j <= r; j++) {
        int z = min(j - 2, t);
        int ts = ((T[j] + Z[i].first) % k + k) % k;
        int tt = get(l + 1, z, ts);
        res += tt;
      }
    }
    Q.insert(t);
    W.insert(-t);
  }
  cout << res;
}
