Cod sursa(job #1700364)

Utilizator BrandonChris Luntraru Brandon Data 10 mai 2016 12:41:52
Problema Divk Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <fstream>

using namespace std;

ifstream cin("divk.in");
ofstream cout("divk.out");

const int MaxN = 500005, AuxVal = -0x3f3f3f3f, MaxK = 100005;

int v[MaxN], ModFreq[MaxK];
int n, k, A, B, CurrSum, RgSum, LfSum = AuxVal, Ans;

int main() {
  cin >> n >> k >> A >> B;

  for (int i = 1; i <= n; ++i) {
    cin >> v[i];

    if (i <= A) {
      CurrSum += v[i];
      CurrSum %= k;
    }
  }

  ModFreq[0] = 1;
  v[0] = AuxVal;

  if (n >= A + 1) Ans += ModFreq[CurrSum];

  for (int i = A + 1; i <= n; ++i) {
    CurrSum += v[i];
    CurrSum %= k;
    RgSum += v[i - A];
    RgSum %= k;

    if (i == B + 1) --ModFreq[0];

    if (i >= B + 1) {
      LfSum = (LfSum < 0) ? 0 : LfSum;
      LfSum += v[i - B];
      LfSum %= k;
    }

    ++ModFreq[RgSum];

    if (LfSum >= 0) {
      --ModFreq[LfSum];
    }


    Ans += ModFreq[CurrSum];
  }

  cout << Ans << '\n';
  return 0;
}