Pagini recente » Cod sursa (job #228739) | Cod sursa (job #225965) | Cod sursa (job #2074352) | Cod sursa (job #1965841) | Cod sursa (job #1666377)
#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;
}