Cod sursa(job #2462674)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 27 septembrie 2019 18:45:52
Problema Divk Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 5 * 1e5;

vector <int> v[100005];
long long s;

int main()
{
    freopen("divk.in", "r", stdin);
    freopen("divk.out", "w", stdout);
    int n, k, a, b, i, nr;
    long long rez = 0;
    scanf("%d%d%d%d", &n, &k, &a, &b);
    for(i = 0; i < k; i++) v[i].push_back(0);
    for(i = 1; i <= n; i++){
        scanf("%d", &nr);
        s = s + nr;
        v[s % k].push_back(i);
        int r, pas;
        r = 0;
        pas = 1 << 20;
        while(pas){
            if(r + pas < v[s % k].size() && v[s%k][r + pas] < i - b + 1)
                r += pas;
            pas >>= 1;
        }
        r++;
        int st = r;
        r = 0;
        pas = 1 << 20;
        while(pas){
            if(r + pas < v[s % k].size() && v[s%k][r + pas] <= i - a + 1)
                r += pas;
            pas >>= 1;
        }
        int dr = r;
        rez += (dr - st + 1);
    }
    printf("%d\n", rez);
    return 0;
}