Cod sursa(job #50705)

Utilizator marius135Dumitran Adrian Marius marius135 Data 8 aprilie 2007 14:26:53
Problema Divk Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.77 kb
#include<stdio.h>

#define max 500001

long v[max];
long ss[max];
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;
	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];
		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;
		
		}
	
	printf("%lld\n",sol);
	
	return 0;
}