Pagini recente » Cod sursa (job #1733741) | Cod sursa (job #1755056) | Cod sursa (job #2272590) | Cod sursa (job #532321) | Cod sursa (job #303932)
Cod sursa(job #303932)
// divk.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
int n,k,a,b,d=0,st,dr;
int e[500001];
int s[500001];
int rest[100000];
int pozitii[100000];
int lista[500001];
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);
for(int 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(int i=1;i<=n;i++)
{
pozitii[i]=pozitii[i-1]+d;
d=rest[i];
}
for(int 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(int 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(int j=st+1;j<=pozitii[i];j++)
{
nr++;
while(lista[st]+a-1<lista[j])
{
st++;
nr--;
}
t=t-(nr-1);
}
i++;
}
printf("%d",t);
return 0;
}