Pagini recente » Cod sursa (job #517318) | Cod sursa (job #945313) | Cod sursa (job #1801211) | Cod sursa (job #899672) | Cod sursa (job #329010)
Cod sursa(job #329010)
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
FILE*fin=fopen("divk.in","r");
FILE*fout=fopen("divk.out","w");
#define nm 500005
#define maxbuf 65536
int s[nm],resturi[100005],r[nm],n,k,a,b;
int ind;
char buf[maxbuf];
inline void refbuf()
{
int ans=fread(buf,1,maxbuf,fin);
if(ans<maxbuf) buf[ans]=0;
ind=0;
}
inline int getnr()
{
int ans=0;
one:
while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
if(ind==maxbuf)
{
refbuf();
goto one;
}
two:
while(ind<maxbuf&&isdigit(buf[ind]))
{
ans=ans*10+buf[ind]-'0';
ind++;
}
if(ind==maxbuf)
{
refbuf();
goto two;
}
}
int main()
{
int i,stop,start;
long long ans=0;
refbuf();
n=getnr();
k=getnr();
a=getnr();
b=getnr();
for(i=1;i<=n;i++)
s[i]=getnr();
//solve
start=-1;stop=-1;
r[0]=0;
for(i=1;i<=n;i++)
{
r[i]=(r[i-1]+s[i])%k;
//bagari
while(i-stop>a)
{
stop++;
resturi[r[stop]]++;
}
//scoateri
if(i-start>b)
if(start>=0)
{
resturi[r[start]]--;
start++;
}
else start++;
ans+=resturi[r[i]];
}
fprintf(fout,"%lld",ans);
fclose(fin);
fclose(fout);
return 0;
}