Pagini recente » Cod sursa (job #687460) | Cod sursa (job #1974729) | Cod sursa (job #1561942) | Cod sursa (job #1388644) | Cod sursa (job #170748)
Cod sursa(job #170748)
#include<cstdio>
int n,a[500001],k,x,y,i,j,l,nr[100001];
long long s[500001];
typedef struct nod{int i;nod* u;}nod;
nod *r[100001],*u[100001],*t;
char str[20],*ps;
long long sol(int x)
{
long long num=0;
if(x==0) return 0;
for(i=0;i<k;i++){
u[i]=r[i];
nr[i]=0;}
for(i=1;i<=n;i++){
j=s[i]%k;
l=i-x;
while(u[j]->i<l){
u[j]=u[j]->u;
nr[j]--;}
num+=nr[j];
nr[j]++;
}
return num;
}
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d %d %d %d ",&n,&k,&x,&y);
for(i=1;i<=n;i++){
gets(str);
ps=str;
j=0;
while(*ps>='0' && *ps<='9'){
j=j*10+*ps-'0';
ps++;}
a[i]=j;
s[i]=s[i-1]+a[i];
j=s[i]%k;
if(!r[j]){
t=new nod;
r[j]=t;
u[j]=t;}
else{
t=new nod;
u[j]->u=t;
u[j]=t;}
u[j]->u=0;
u[j]->i=i;}
printf("%lld",sol(y)-sol(x-1));
fclose(stdout);
return 0;
}