Cod sursa(job #1052471)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 11 decembrie 2013 12:53:27
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
#include <cstring>
#define MAXN 500001
#define MAXK 100001
using namespace std;

int v[MAXN], freq[MAXK], sume[MAXN];

int main() {
  int N, K, A, B;
  ifstream in("divk.in");
  in >> N >> K >> A >> B;

  v[0] = 0;
  for (int i = 1; i <= N; ++i) {
    in >> v[i];
  }
  in.close();

  sume[0] = 0;
  for (int i = 1; i <= N; ++i) {
    sume[i] = (sume[i - 1] + v[i]) % K;
  }

  // calculam f(B):
  int fB = 0;
  for (int i = 0; i < B; ++i) {
    int rest = sume[i];
    fB += freq[rest];
    ++freq[rest];
  }

  for (int i = B; i <= N; ++i) {
    int rest = sume[i];
    fB += freq[rest];
    ++freq[rest];
    --freq[sume[i - B]];
  }

  // calculam f(A - 1):
  int fA1 = 0;
  memset(freq, 0, sizeof(freq));
  for (int i = 0; i < A - 1; ++i) {
    int rest = sume[i];
    fA1 += freq[rest];
    ++freq[rest];
  }

  for (int i = A - 1; i <= N; ++i) {
    int rest = sume[i];
    fA1 += freq[rest];
    ++freq[rest];
    --freq[sume[i - A + 1]];
  }

  ofstream out("divk.out");
  out << fB - fA1;
  out.close();

  return 0;
}