Cod sursa(job #246598)

Utilizator Mishu91Andrei Misarca Mishu91 Data 21 ianuarie 2009 09:58:24
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MAX_N 500005
#define MAX_K 100005

int A, B, K, N;
int V[MAX_N];

vector <int> H[MAX_N];

void citire()
{
    scanf("%d %d %d %d",&N, &K, &A, &B);

    for(int i = 1; i <= N; ++i)
        scanf("%d",V+i);
}

int find(int L)
{
    int Rez = 0;
    for(int i = 0; i < K; ++i)
    {
        if(H[i].empty() || H[i].size() < 2) continue;

        int i1 = 0, i2 = 1;
        for(;i2 < H[i].size(); ++i2)
        {
            while(H[i][i2] - H[i][i1] > L)
                ++i1;
            Rez += (i2 - i1);
        }
    }
    return Rez;
}

void solve()
{
    int s = 0;
    H[0].push_back(0);
    for(int i = 1; i <= N; ++i)
    {
        s = (s + V[i]) % K;
        H[s].push_back(i);
    }
    int Rez = find(B) - find(A - 1);

    printf("%d\n",Rez);
}

int main()
{
    freopen("divk.in","rt",stdin);
    freopen("divk.out","wt",stdout);

    citire();
    solve();
}