Pagini recente » Cod sursa (job #958833) | Cod sursa (job #2125698) | Cod sursa (job #725386) | Cod sursa (job #2069167) | Cod sursa (job #303942)
Cod sursa(job #303942)
// 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 to[1000001];
void adunare()
{
int trans=0,i=1;
while(trans || t)
{
to[i]=(trans=trans+t%10+to[i])%10;
t=t/10;
trans=trans/10;
i++;
}
while(to[to[0]+1]!=0)
to[0]++;
}
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)
{
t=0;
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);
}
adunare();
i++;
}
for(i=to[0];i>=1;i--)
printf("%lld",to[i]);
return 0;
}