Cod sursa(job #1040184)

Utilizator gener.omerGener Omer gener.omer Data 24 noiembrie 2013 01:28:41
Problema Divk Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#include <vector>
#include <algorithm>
 
using namespace std;

#define NMAX 500005
#define KMAX 100005

int N, K, A, B, X[NMAX];
long long sum[NMAX];
vector<int> all[KMAX];

void precompute()
{
	sum[0] = 0;
	sum[1] = X[1];
	for(int i = 1; i <= N; ++i)
		sum[i] = sum[i-1] + X[i];
	for(int i = 1; i <= N; ++i)
		all[sum[i]%K].push_back(i);
}

long long solve(int n){
	long long ret = 0;
	for(int r = 0; r < K; ++r)	
		if(all[r].size() != 0){
			int b = 0, e = 0, m = all[r].size();
			while(b < m){
				while(e < m && ((all[r][e] - all[r][b] + 1) <= n)) ++e;
				--e;
				ret += (e-r+1);
				b++;
			}
		}
	return ret;
}

long long solve_1()
{
	return solve(B) - solve(A-1);
}

int main()
{
	ifstream in("divk.in");
	ofstream out("divk.out");
	
	in >> N >> K >> A >> B;
	
	for(int i = 1; i <= N; ++i)
		in >> X[i];
	precompute();
	
	out << solve_1();
	return 0;
}