Cod sursa(job #1548211)

Utilizator cristina_borzaCristina Borza cristina_borza Data 10 decembrie 2015 17:35:45
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define NMAX 500005

using namespace std;

vector <vector <int> > aux;

int v[NMAX] , p[NMAX];
int n , k , a , b;

int solve(int nr);

int main() {
    freopen("divk.in" , "r" , stdin);
    freopen("divk.out" , "w" , stdout);

    int sum = 0;

    scanf("%d %d %d %d" , &n , &k , &a , &b);

    aux.resize(k + 5);
    aux[0].push_back(0);

    for(int i = 1 ; i <= n ; ++i) {
        scanf("%d" , &v[i]);
        sum += v[i];
        if(sum >= k) {
            sum -= k;
        }
        aux[sum].push_back(i);
    }

    int sol = solve(b) - solve(a - 1);
    printf("%d" , sol);
    return 0;
}

int solve(int nr) {
    int sum = 0 , sol = 0;

    memset(p , 0 , sizeof(p));

    for(int i = 1 ; i <= n ; ++i) {
        sum += v[i];
        if(sum >= k) {
            sum -= k;
        }

        while(p[sum] < aux[sum % k].size() && aux[sum][p[sum]] < i - nr) {
            ++p[sum];
        }

        sol += i - p[sum];
    }

    return sol;
}