Cod sursa(job #1738605)

Utilizator cella.florescuCella Florescu cella.florescu Data 7 august 2016 11:36:00
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>
#include <cctype>
#define LIM 2097152
#define MAXN 500000
#define MAXK 100000

using namespace std;

FILE *fin;
int p=LIM-1;
char s[LIM];

inline void avans(){
  if(++p==LIM){
    fread(s, 1, LIM, fin);
    p=0;
  }
}

inline int getnumber(){
  int nr=0;
  while(isdigit(s[p])==0)
    avans();
  while(isdigit(s[p])){
    nr=nr*10+s[p]-'0';
    avans();
  }
  return nr;
}

int v[MAXN+1], rest[MAXK];

int main()
{
    FILE *fout;
    long long ans;
    int n, k, a, b, i;
    fin=fopen("divk.in", "r");
    fscanf(fin, "%d%d%d%d", &n, &k, &a, &b);
    ans=0LL;
    for(i=1; i<=n; i++){
      v[i]=(v[i-1]+getnumber())%k;
      if(i>=a){
        rest[v[i-a]]++;
        if(i>b)
          rest[v[i-b-1]]--;
      }
      ans+=1LL*rest[v[i]];
    }
    fclose(fin);
    fout=fopen("divk.out", "w");
    fprintf(fout, "%lld\n", ans);
    fclose(fout);
    return 0;
}