Cod sursa(job #2156151)

Utilizator Constantin.Dragancea Constantin Constantin. Data 8 martie 2018 15:24:12
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n, k, a, b, dp[500010];
vector <int> v[100005];

#define dim 100000
char buff[dim];
int p = 0;

void read (int &nr){
    nr = 0;
    while (buff[p] < '0' || buff[p] > '9')
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    while (buff[p] >= '0' && buff[p] <= '9'){
        nr = 10*nr + buff[p] - '0';
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    }
}

ll get(int l){
    ll ans = 0;
    for (int i=0; i<k; i++){
        if (v[i].size() > 1){
            int st = 0, dr = 0;
            while (st < v[i].size()){
                dr = st;
                while (dr + 1 < v[i].size() && v[i][dr + 1] - v[i][st] <= l) dr++;
                if (dr == v[i].size() - 1) ans += (dr - st)*(dr - st + 1)/2, st = dr;
                else ans += dr - st;
                st++;
            }
        }
    }
    return ans;
}

int main(){
    freopen("divk.in","r",stdin);
    freopen("divk.out","w",stdout);
    read(n); read(k); read(a); read(b);
    v[0].push_back(0);
    for (int i=1; i<=n; i++) read(dp[i]), dp[i] = (dp[i] + dp[i-1])%k, v[dp[i]].push_back(i);
    cout << get(b) - get(a - 1);
    return 0;
}