Pagini recente » Cod sursa (job #2127065) | Cod sursa (job #564059) | Cod sursa (job #1929253) | Cod sursa (job #1928264) | Cod sursa (job #344259)
Cod sursa(job #344259)
#include <stdio.h>
#define Nmax 500010
int A,B,n,k,i,z,zs,zf,nr;
int a[Nmax],poz[Nmax];
void sort(int l,int r){
int xa,xp,y,i,j;
i=l; j=r; xa=a[l+(r-l)/2]; xp=poz[l+(r-l)/2];
do{
while(a[i] < xa || (a[i]==xa && poz[i] < xp)) i++;
while(xa < a[j] || (a[j]==xa && xp < poz[j])) j--;
if(i<=j){
y=a[i]; a[i]=a[j]; a[j]=y;
y=poz[i]; poz[i]=poz[j]; poz[j]=y;
i++; j--;
}
} while(i<=j);
if(i<r) sort(i,r);
if(l<j) sort(l,j);
}
int main(){
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
scanf("%d%d%d%d",&n,&k,&A,&B);
for(i=1;i<=n;++i){
scanf("%d",&a[i]);
a[i] =(a[i-1]+a[i])% k;
poz[i]=i;
}
sort(1,n);
for(i=1,zs=zf=2; i<=n; ++i){
while(poz[zs]-poz[i] <A && a[zs]==a[i] && zs<=n) zs++;
while(poz[zf]-poz[i] <=B && a[zf]==a[i] && zf<=n) zf++;
nr += zf-zs;
if(a[i]==0 && A<=poz[i] && poz[i]<=B) nr++;
}
printf("%d\n",nr);
fclose(stdin); fclose(stdout);
return 0;
}