Cod sursa(job #2907671)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 31 mai 2022 00:52:50
Problema Divk Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
/// [A][M][C][B][N] ///
#include <bits/stdc++.h>
using namespace std;
const int mod = 9901, inf = 0x3f3f3f3f;
const char sp = ' ', nl = '\n';
ifstream fin("divk.in");
ofstream fout("divk.out");

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, k, a, b;
    fin >> n >> k >> a >> b;
    vector<vector<int>> m(k);
    m[0].push_back(0);
    int x, y = 0;
    for (int i = 1; i <= n; ++i) {
        fin >> x;
        y = (x + y) % k;
        m[y].push_back(i);
    }
    long long ans = 0;
    for (auto& v : m) {
        for (int i = 0; i < v.size() - 1; ++i) {
            int st = i + 1, dr = v.size() - 1, mid, l = -1, r = -1;
            while (st <= dr) {
                mid = (st + dr) / 2;
                if (v[mid] - v[i] >= a) {
                    l = mid, dr = mid - 1;
                }
                else {
                    st = mid + 1;
                }
            }
            st = i + 1, dr = v.size() - 1;
            while (st <= dr) {
                mid = (st + dr) / 2;
                if (v[mid] - v[i] <= b) {
                    r = mid, st = mid + 1;
                }
                else {
                    dr = mid - 1;
                }
            }
            if (l != -1 && r != -1) {
                ans += r - l + 1;
            }
        }
    }
    fout << ans;
}