Pagini recente » Cod sursa (job #2760705) | Cod sursa (job #1439078) | Cod sursa (job #1674743) | Cod sursa (job #407761) | Cod sursa (job #1038544)
#include <fstream>
using namespace std;
ifstream in ("divk.in");
ofstream out ("divk.out");
const int N = 500001;
const int K = 100001;
//ATENTIE!! valorile sunt long long
long long n , k , a , b , r[N], nr[K], rez;
int main()
{
//citim datele de intrare
in >> n >> k >> a >> b;
for (int i = 1; i <=n ; i++ ){
int x;
//citim elementul de pe pozitia i
//nu ne intereseaza valoarea lui decat la pasul curent
in>>x;
//restul nou este restul vechi plus elementul nou
r[i] = ( r[ i-1 ] + x ) % k ;
//daca i este mai mare ca b inseamna ca trebuie sa eliminam
//resturile mai vechi pentru ca secventa ar fi prea mare
if ( i > b ){
nr [ r [ i - b - 1 ] ] -- ;
}
//daca i este mai mare ca a inseamna ca putem sa adaugam
//resturile pentru ca ar face parte din secventa
if ( i >= a ){
nr [ r [ i-a ] ] ++ ;
}
//in final adaugam la rezultat nr de subsecvente posibile
//care se termina in pozitia i
rez = rez + nr [ r[ i ] ] ;
}
//afisam rezultat
out << rez;
return 0;
}