Cod sursa(job #1666377)

Utilizator TincaMateiTinca Matei TincaMatei Data 27 martie 2016 23:37:29
Problema Divk Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#define MAX_K 100000
#define MAX_N 500000

int sp[ 1 + MAX_N ];
int fr[ MAX_K ];

int main() {
  int n , k , a , b , x , i;
  long long rez;
  FILE *fin = fopen( "divk.in" , "r" );
  fscanf( fin , "%d%d%d%d" , &n , &k , &a , &b );
  rez = 0LL;
  for( i = 1 ; i <= n ; i++ ) {
    fscanf( fin , "%d" , &x );
    //ne cream vectorul de sume partiale
    sp[ i ] = ( sp[ i - 1 ] + x ) % k;
    //daca i este mai mare decat a inseamna ca trebuie sa adaugam restul unei sume partiale
    if( i >= a ) {
      fr[ sp[ i - a ] ]++;
      //daca i este mai mare si decat b inseamna ca trebuie sa scoatem restul unei sume partiale
      rez += fr[ sp[ i ] ]; //din resturile pe care le avem putem vedea cate sume care se
      //termina in i dau rest 0 la impartirea cu k
      if( i >= b )
        fr[ sp[ i - b ] ]--;
    }
  }
  fclose( fin );

  FILE *fout = fopen( "divk.out" , "w" );
  fprintf( fout , "%d" , rez );
  fclose( fout );
  return 0;
}