Pagini recente » Cod sursa (job #1604628) | Cod sursa (job #122607) | Cod sursa (job #1100834) | Cod sursa (job #67474) | Cod sursa (job #907312)
Cod sursa(job #907312)
#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;
}