#include <iostream>
#include <fstream>
using namespace std;
int *sume, *rest, n, k, A, B, *cate;
/*
Se da un sir de n numere. Sa se afiseze cate secvente cu lungimea cuprinsa intre A si B, inclusiv, ce se impart exact la k exista.
Iddea de la secvaenta de suma maxima : fac S_i = suma primelor i elemente. Daca am doua sume ce imi dau acelasi rest, atunci dif
dintre ele inseamna ca imi da o secventa cu suma divizibila cu k. Folosesc 2 vct desi este suficient unul singur.
in cate[i] retin de cate ori apare restul i in secventa pe care o analizez;
*/
void citeste()
{
ifstream f("divk.in");
f >> n >> k >> A >> B;
sume = new int[n+1];
rest = new int[n+1];
cate = new int[n+1];
f >> sume[1];
rest[1] = sume[1] % k;
cate[0] = cate[1] = 0;
rest[0] = 0;
int i, x, j;
for(i = 2; i <= n; ++i)
{
f >> x;
sume[i] = sume[i - 1] + x;
rest[i] = sume[i] % k;
cate[i] = 0;
}
f.close();
}
void dinamica()
{
ofstream g("divk.out");
int cnt = 0, i ;
//cout << "resturi :" << endl;
for(i = 1; i <= n; ++i)
// cout << rest[i] << " ";
citeste();
//cout << endl;
for(i = 1; i <= n; ++i)
{
if (i - B - 1 >= 0)
{
int calc = i - B - 1;
// cout << "i = " << i << endl;
// cout << "rest[" << calc << "] = " << rest[calc] << endl;
// cout <<"inainte, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
--cate[rest[calc]];
// cout <<"dupa, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
}
if (i - A >= 0)
{
int calc = i - A;
// cout << "-->i = " << i << endl;
// cout << "-->rest[" << calc << "] = " << rest[calc] << endl;
// cout <<"-->inainte, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
++cate[rest[calc]];
// cout <<"-->dupa, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
}
cnt += cate[rest[i]];
//cin.get();
}
// cout << cnt << endl;
g << cnt << endl;
}
int main()
{
citeste();
dinamica();
return 0;
}