Cod sursa(job #1038544)

Utilizator vladstoickvladstoick vladstoick Data 21 noiembrie 2013 18:39:47
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#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;
}