Pagini recente » Cod sursa (job #1951908) | Cod sursa (job #345455) | Cod sursa (job #1748042) | Cod sursa (job #1655770) | Cod sursa (job #2525350)
#include <vector>
#include <fstream>
using namespace std;
ofstream cout("divk.out");
char buf[5500000];
int chari = 0;
int readint(){
while(!((buf[chari] >= '0') && (buf[chari] <= '9'))){
chari++;
}
int result = 0;
while((buf[chari] >= '0') && (buf[chari] <= '9')){
result *= 10;
result += buf[chari] - '0';
chari++;
}
return result;
}
int n, k, a, b;
unsigned long long sequences = 0;
struct node {
node *next = NULL;
int val = 0;
};
node *mem = new node[700000];
struct distances {
node *far = NULL, *close = NULL, *last = NULL;
int fari = 0, closei = 0;
void process(int i) {
last->next = mem;
last = mem++;
last->val = i;
while((far->next != NULL) && ((i - far->next->val + 1) > b)){
far = far->next;
fari++;
}
while((close->next != NULL) && ((i - close->next->val + 1) >= a)){
close = close->next;
closei++;
}
sequences += (closei - fari);
}
distances(){
far = mem++;
close = far;
last = close;
}
};
distances sums[100001];
int main() {
auto F = fopen("divk.in", "r");
fread(buf, sizeof(char), 5500000, F);
n = readint(), k = readint(), a = readint(), b = readint();
a++;
b++;
sums[0].process(0);
for(int x = 1, tmp, last = 0; x<=n; x++) {
tmp = readint();
last += tmp;
last %= k;
sums[last].process(x);
}
cout<<sequences<<endl;
}