Cod sursa(job #907312)

Utilizator h2g2Ford Prefect h2g2 Data 7 martie 2013 20:18:24
Problema Divk Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define nmax 500005
#define kmax 100005
using namespace std;

int n, k, i, j, v[nmax], s[nmax], cu_rest[kmax], minim, maxim;
long long sol = 0;
int main() {
	ifstream f("divk.in");
	ofstream g("divk.out");
	
	//o secventa [j,i] ii ok daca s[i] % k == s[j-1] % k
	//pentru un i dat, is bune secventele care incep pe una din pozitiile [i-maxim+1, i-minim+1]
	//asta inseamna ca, pentru un i nou, pozitia i-minim+1 trebuie adaugata (pozitia din v[])
	//si pozitia i-maxim trebuie eliminimata (tot pozitie din v[])
	
	memset(cu_rest, 0, kmax*sizeof(int));
	
	f>>n>>k>>minim>>maxim;
	s[0] = 0;
	for(i=1; i<=n; i++) {
		f>>v[i];
		s[i] = (s[i-1] + v[i])%k;
	}
	
	
	cu_rest[s[0]] = 1;
	for(i=1; i<=n; i++) {
		if(i-minim >= 1) cu_rest[s[i-minim]]++;
		if(i-maxim >= 1) cu_rest[ s[i-maxim-1] ]--;
		sol += 1LL * cu_rest[ s[i] ];
		
		//cout<<"exista "<<cu_rest[s[i]]<<" care se termina pe pozitia "<<i<<"\n";
	}
	
	cout<<sol<<"\n";
	g<<sol<<"\n";

	return 0;
}