Cod sursa(job #2155139)

Utilizator flibiaVisanu Cristian flibia Data 7 martie 2018 17:15:52
Problema Divk Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>

using namespace std;

#define dim 100000
char buff[dim];
int p = 0;

void read(int &nr){
	nr = 0;
	while(buff[p] < '0' || buff[p] > '9')
		if(++p == dim) 
			fread(buff, 1, dim, stdin), p = 0;
	while(buff[p] >= '0' && buff[p] <= '9'){
		nr = 10 * nr + buff[p] - '0';
		if(++p == dim) 
			fread(buff, 1, dim, stdin), p = 0;
	}
}

int dp[500100], n, x, mod, st, dr, mx, mn;
vector <int> v[100100];
long long rs;

int main(){
	freopen("divk.in", "r", stdin);
	freopen("divk.out", "w", stdout);
	cin >> n >> mod >> mn >> mx;
	for(int i = 1; i <= n; i++){
		read(x);
		dp[i] = (dp[i - 1] + x) % mod;
	}
	v[0].push_back(0);
	for(int i = 1; i <= n; i++){
		st = max(0, i - mx);
		dr = max(0, i - mn);
		auto it = upper_bound(v[dp[i]].begin(), v[dp[i]].end(), st - 1) - v[dp[i]].begin();
		auto it2 = upper_bound(v[dp[i]].begin(), v[dp[i]].end(), dr) - v[dp[i]].begin();
		rs += it2 - it;
		v[dp[i]].push_back(i);
	}
	cout << rs;
	return 0;
}