Pagini recente » Cod sursa (job #2337686) | Cod sursa (job #164238) | Cod sursa (job #2937649) | Cod sursa (job #1562597) | Cod sursa (job #1561218)
#include <cstdio>
#include <vector>
#define MAX 100000
using namespace std;
vector<int> v[MAX+1];
int main()
{
freopen("divk.in", "r", stdin);
freopen("divk.out", "w", stdout);
int n, k,a,b, i, s=0, st, dr, mij, x, j;
long long r=0, poza, pozb;
scanf("%d%d%d%d", &n, &k, &a, &b);
v[0].push_back(0);
for(i=1;i<=n;i++)
{
scanf("%d", &x);
s=(s+x)%k;
v[s].push_back(i);
}
for(i=0;i<k;i++)
{
for(j=0;j<v[i].size();j++)
{
st=j+1;
dr=v[i].size()-1;
poza=0;
pozb=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[i][mij]-v[i][j]>=a){
if(v[i][mij]-v[i][j]<=b) poza=mij;
dr=mij-1;
}
else st=mij+1;
}
st=j+1;
dr=v[i].size()-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[i][mij]-v[i][j]<=b)
{
if (v[i][mij]-v[i][j]>=a) pozb=mij;
st=mij+1;
}else dr=mij-1;
}
r+=pozb-poza+1;
}
}
printf("%lld", r);
return 0;
}