Cod sursa(job #1566218)

Utilizator dnprxDan Pracsiu dnprx Data 11 ianuarie 2016 21:16:03
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <bits/stdc++.h>
#define nmax 100001

using namespace std;

vector<int> h[nmax];
int n, K, A, B;

void Citire()
{
    int i, x, s;
    ifstream fin("divk.in");
    fin >> n >> K >> A >> B;
    s = 0;
    h[0].push_back(0);
    for (i = 1; i <= n; ++i)
    {
        fin >> x;
        s = (s + x) % K;
        h[s].push_back(i);
    }
    fin.close();
}

/// cate secvente de lungime cel mult L au suma divizibila cu K
long long Rezolva(int L)
{
    int i, j;
    unsigned p;
    long long nrSecv = 0;
    for (i = 0; i < K; ++i)
    {
        /// parcurg lista h[i] cu indicii divizibili cu i
        j = 0;
        for (p = 0; p < h[i].size(); ++p)
        {
            while (h[i][p] - h[i][j] > L)
                j++;
            nrSecv += (p - j + 1);
        }
    }
    return nrSecv;
}

void Afisare()
{
    long long sol;
    sol = Rezolva(B) - Rezolva(A - 1);
    ofstream fout("divk.out");
    fout << sol << "\n";
    fout.close();
}

int main()
{
    Citire();
    Afisare();
    return 0;
}