Pagini recente » Cod sursa (job #2217736) | Cod sursa (job #2397316) | Cod sursa (job #2431629) | Cod sursa (job #152152) | Cod sursa (job #50726)
Cod sursa(job #50726)
#include<stdio.h>
#define max 500001
long v[max];
long ss[max],ww[max],j;
long sel[max/4];
int main()
{
freopen("divk.in","r",stdin);
freopen("divk.out","w",stdout);
long n,a,b,k,x,s=0,rest =0,i,w,q=0;
long long sol=0;
scanf("%ld%ld%ld%ld",&n,&k,&a,&b);
for(i=1;i<=n;i++) {scanf("%ld",&x);v[i]=x%k;}
for(i=1;i<=a-1;i++)
s+=v[i];
s%=k;
x =0;
for(i = a; i<=b;i++) {x+=v[i];x%=k;ss[i] =x; sel[x]++;}
for(i = a-1;i<=n-1;i++)
{
long sss = s -rest;
while(sss<0) sss+=k;
w = k - sss;
if(w==k) w=0;
sol +=sel[w];
if(sol>2147000000)
{q++;}
sel[ss[i+1]]--;
if(i+b-a+2<=n)
{
x+=v[i+b-a+2];x%=k;
ss[i+b-a+2] = x;
sel[x]++;
}
rest+=v[i+1];rest%=k;
s+=v[i+1]; s-=v[i-a+2];if(s<0) s+=k;
}
long rrr,rrq;
if(n>=10000)
{
rrr = sol/1000000;
rrq = sol%1000000;
if(rrr)
printf("%ld%ld\n",rrr,rrq);
else printf("%ld\n",rrq);
return 0;
}
for(i=1;i<=n;i++)
ww[i]=(ww[i-1]+v[i])%k;
sol = 0;
for(i=1;i<=n;i++)
for(j=i+a;j<=i+b && j<=n+1;j++)
if( (ww[j-1]-ww[i-1]+k)%k==0)
{ sol++;/*printf("%ld %ld\n",i,j-1);*/}
rrr = sol/1000000;
rrq = sol%1000000;
if(rrr)
printf("%ld%ld\n",rrr,rrq);
else printf("%ld\n",rrq);
return 0;
}