Pagini recente » Cod sursa (job #356087) | Cod sursa (job #1567338) | Cod sursa (job #672912) | Cod sursa (job #1567410) | Cod sursa (job #2903868)
#include <stdio.h>
#include <stdint.h>
void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
uint8_t ch;
*nr = 0;
while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
*nr *= 10;
*nr += ch - '0';
}
if (ch == '\r') {
fgetc(stream);
}
}
uint32_t a[500001];
uint32_t b[100001];
struct queue {
uint32_t q[500001];
uint32_t st;
uint32_t ed;
};
struct queue q;
void pop(struct queue *__restrict q) {
++q->st;
q->st %= 500000;
}
uint32_t top(struct queue *__restrict q) {
return q->q[q->st];
}
void push(struct queue *__restrict q, uint32_t val) {
q->q[q->ed] = val;
++q->ed;
q->ed %= 500000;
}
uint32_t n, k, x, y;
int main(void) {
uint32_t sum = 0;
{
FILE *__restrict in = fopen("divk.in", "r");
read_uint32_t(in, &n);
read_uint32_t(in, &k);
read_uint32_t(in, &x);
read_uint32_t(in, &y);
{
int32_t i;
uint32_t h;
for(i = 1; i <= n; ++i) {
read_uint32_t(in, &h);
a[i] = (a[i - 1] + h) % k;
}
}
fclose(in);
}
{
int32_t i;
for(i = 1; i < x; ++i) {
push(&q, a[i]);
}
b[0] = 1;
for (i = x; i <= n; ++i) {
sum += b[a[i]];
if (i <= n) {
push(&q, a[i]);
}
if (y <= i) {
--b[a[i - y]];
}
b[top(&q)]++;
pop(&q);
}
}
{
FILE *__restrict out = fopen("divk.out", "w");
fprintf(out, "%u", sum);
fclose(out);
}
return 0;
}