Pagini recente » Cod sursa (job #1513634) | Cod sursa (job #2452719) | Cod sursa (job #3224039) | Cod sursa (job #872664) | Cod sursa (job #303951)
Cod sursa(job #303951)
// 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()
{
long long trans=0,i=1,copiet=t,nr=0;
while(copiet)
{
nr++;
copiet=copiet/10;
}
while(trans || t)
{
to[i]=(trans=trans+t%10+to[i])%10;
t=t/10;
trans=trans/10;
i++;
}
for(i=to[0]+1;i<=to[i]+1+nr;i++)
if(to[i]!=0)
to[0]=i;
}
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("%d",to[i]);
return 0;
}