Cod sursa(job #1040356)

Utilizator gener.omerGener Omer gener.omer Data 24 noiembrie 2013 14:18:29
Problema Divk Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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;
	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;
	//cout << "n= " << n << endl;
	// check the sums with r = 0
	for(unsigned i = 0; i < all[0].size(); ++i)
		if(all[0][i] <= n)
			++ret;
	//cout << "ret=" << ret << endl;
	// check for each possible remainder
	for(int r = 0; r < K; ++r)
		if(all[r].size() != 0){
			int b = 0, e = 1, m = all[r].size();
			while(b < m){
				if(e < m && ((all[r][e] - all[r][b]) <= n)) ++e, ++ret;
				else b++, e = b + 1;
			}
			//cout << r << ": " << ret << endl;
		}
	
	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;
}