Cod sursa(job #1497483)

Utilizator aimrdlAndrei mrdl aimrdl Data 6 octombrie 2015 21:23:02
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>

int v[500005], N, A, B, K, maxlen, sol;
int *len; //keeps length of sums
long long *s; //actual sums

void readInit (void) {
	scanf("%d %d %d %d", &N, &K, &A, &B);
	
	for (int i = 1; i <= N; ++i) {
		scanf("%d", &v[i]);
	}
	

	s = new long long [B - A + 1]();
	len = new int [B - A + 1];
	
	for (int i = A; i <= B; ++i) {
		len[i - A] = i;
	}
}

void solve (void) {
	//init sums
	for (int i = 1; i <= A; ++i) {
		s[0] += v[i];
		if (s[0] % K == 0) ++sol;
	}
	
	for (int i = A + 1; i <= B; ++i) {
		s[i - A] = s[i - A - 1] + v[i];
		if (s[i - A] % K == 0) ++sol;
	}
	
	//slide window over vector
	int i;
	for (i = 2; i <= N - B + 1; ++i) {
		//update sums
		for (int j = 0; j <= B - A; ++j) {
			s[j] = s[j] - v[i-1] + v[i + j + A - 1];
			if (s[j] % K == 0) ++sol;
		}
	}
	
	for (; i <= N - A + 1; ++i) {
		for (int j = 0; j < N - i; ++j) {
			s[j] = s[j] - v[i-1] + v[i + j + A - 1];
			if (s[j] % K == 0) ++sol;
		}
	}
}	
	
int main (void) {
	freopen("divk.in", "r", stdin);
	freopen("divk.out", "w", stdout);
	
	readInit();
	solve();
	printf("%d", sol);
	
	return 0;
}