Pagini recente » Cod sursa (job #176929) | Cod sursa (job #152798) | Cod sursa (job #2307490) | Cod sursa (job #163386) | Cod sursa (job #1552718)
#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;
}