Cod sursa(job #1548161)

Utilizator cristina_borzaCristina Borza cristina_borza Data 10 decembrie 2015 16:53:21
Problema Divk Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define NMAX 500005

using namespace std;


vector <vector <long long> > aux;

long long v[NMAX] , p[NMAX] , dp[NMAX];
long long n , k , a , b;

long long solve(long long nr);

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

    long long sum = 0;

    scanf("%lld %lld %lld %lld" , &n , &k , &a , &b);//f >> n >> k >> a >> b;

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

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

    int sol = solve(b) - solve(a - 1);
    printf("%lld" , sol);//g << sol;
    return 0;
}

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

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

    dp[0] = 1;

    for(int i = 1 ; i <= n ; ++i) {
        sum += v[i];
        ++dp[sum % k];

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

        sol += dp[sum % k] - 1;
    }

    return sol;
}