Pagini recente » Cod sursa (job #1133929) | Cod sursa (job #2208595) | Cod sursa (job #2276235) | Cod sursa (job #1140434) | Cod sursa (job #303955)
Cod sursa(job #303955)
// divk.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
int n,k,a,b,d=0,st,dr;
int e[510005];
int s[510005];
int rest[510005];
int pozitii[510005];
int lista[510005];
unsigned long long t=0,nr;
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d %d %d %d",&n,&k,&a,&b);
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&e[i]);
s[i]=(s[i-1]+e[i])%k;
rest[s[i]]++;
}
pozitii[0]=1;
d=rest[0];
for(i=1;i<=n;i++)
{
pozitii[i]=pozitii[i-1]+d;
d=rest[i];
}
for(i=1;i<=n;i++)
lista[++pozitii[s[i]]]=i;
i=0;
while(i<k)
{
if(i>0)
st=pozitii[i-1]+1;
else
st=1;
nr=1;
for(j=st+1;j<=pozitii[i];j++)
{
nr++;
while(lista[st]+b<lista[j])
{
st++;
nr--;
}
t=t+nr-1;
}
if(i>0)
st=pozitii[i-1]+1;
else
st=1;
nr=1;
for(j=st+1;j<=pozitii[i];j++)
{
nr++;
while(lista[st]+a-1<lista[j])
{
st++;
nr--;
}
t=t-(nr-1);
}
i++;
}
printf("%llu",t);
return 0;
}