Cod sursa(job #208789)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 18 septembrie 2008 16:09:14
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <math.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;
		}
		if (sel[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;
		}
		s %= k;
	}
	
	long rrr, rrq;
	
	
		rrr = sol / 1000000;
		rrq = sol % 1000000;
		if (rrr > 0) {
			printf("%ld%ld\n",rrr,rrq);
		} else {
			printf("%ld\n",rrq);
		}
	return 0;
}