Cod sursa(job #792595)

Utilizator vld7Campeanu Vlad vld7 Data 27 septembrie 2012 21:06:26
Problema Divk Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <vector>

#define maxN 500005

using namespace std;

FILE *f = fopen ("divk.in","r");
FILE *g = fopen ("divk.out","w");

int n, K, a, b, v[maxN];
long long sum[maxN], SOL;
vector<int> L[maxN];

void read()
{
	fscanf (f, "%d%d%d%d", &n, &K, &a, &b);
	for (int i = 1; i <= n; i++) {
		fscanf (f, "%d", &v[i]);
		sum[i] = sum[i - 1] + 1LL * v[i];
	}
	for (int i = 1; i <= n; i++)
		L[sum[i] % K].push_back(i);
}

void solve()
{
	int ind;
	
	for (int i = 0; i < L[0].size(); i++) {
		if (i == 0)
			ind = 0;
		else
			ind = L[0][i - 1];
		for (int j = i; j < L[0].size() && (L[0][j] - ind <= b); j++)
			if (L[0][j] - ind >= a)
				SOL++;
	}
		
	for (int i = 1; i <= K - 1; i++)
		if (L[i].size() > 1) {
			for (int j = 0; j < L[i].size(); j++)
				for (int k = j + 1; k < L[i].size() && (L[i][k] - L[i][j] <= b); k++)
					if (L[i][k] - L[i][j] >= a)
						SOL++;
		}
}

int main()
{
	read();
	solve();
	
	fprintf (g, "%lld\n", SOL);
	
	fclose(f);
	fclose(g);
	
	return 0;
}