Cod sursa(job #2903877)

Utilizator ptlsebiptl sebi ptlsebi Data 17 mai 2022 21:16:06
Problema Divk Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#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];
uint64_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) {
  uint64_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, "%llu", sum);
  
    fclose(out);
  }

  return 0;
}