Cod sursa(job #1552718)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 18 decembrie 2015 15:05:40
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<fstream>
#include<cstdio>
#include<vector>
#include<cstring>
#define DIM 1000005
using namespace std;
int n, k, a, b, p, u, mid, x, i, j, sum, r;
long long sol;
char s[DIM + 5];
vector< int > v[100005];
FILE * fin = fopen("divk.in", "r");
FILE * fout = fopen("divk.out", "w");
int num(){
    while(s[r] < '0' || s[r] > '9'){
        r++;
        if(r == DIM){
            r = 0;
            fread(s, 1, DIM, fin);
        }
    }
    int nr = 0;
    while(s[r] >= '0' && s[r] <= '9'){
        nr = nr * 10 + s[r] - '0';
        r++;
        if(r == DIM){
            r = 0;
            fread(s, 1, DIM, fin);
        }
    }
    return nr;
}
int main(){
    fread(s, 1, DIM, fin);
    n = num();
    k = num();
    a = num();
    b = num();
    for(i = 1; i <= n; i++){
        x = num();
        sum = (sum + x) % k;
        v[sum].push_back(i);
    }
    for(i = 0; i < v[0].size(); i++){
        if(v[0][i] >= a && v[0][i] <= b){
            sol++;
        }
    }
    for(j = 0; j < k; j++){
        for(i = 0; i < v[j].size(); i++){
            p = i + 1;
            u = v[j].size() - 1;
            while(p <= u){
                mid = (p + u) / 2;
                if(v[j][mid] - v[j][i] >= a){
                    u = mid - 1;
                }
                else{
                    p = mid + 1;
                }
            }
            x = p;

            p = i + 1;
            u = v[j].size() - 1;
            while(p <= u){
                mid = (p + u) / 2;
                if(v[j][mid] - v[j][i] <= b){
                    p = mid + 1;
                }
                else{
                    u = mid - 1;
                }
            }

            sol += u - x + 1;
        }
    }
    fprintf(fout, "%lld\n", sol);
    return 0;
}