Cod sursa(job #208690)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 septembrie 2008 21:24:27
Problema Divk Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <math.h>

#define max 500001

long n, a, b, k, x, s, rest, i, w, q;
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 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]) {
			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;
	
	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;
			}
		}
	}
	rrr = sol / 1000000;
	rrq = sol % 1000000;
	if (rrr > 0) {
		printf("%ld%ld\n", rrr, rrq);
	} else {
		printf("%ld\n", rrq);
	}
	
	return 0;
}