Cod sursa(job #614903)

Utilizator vlad2901Vlad Berindei vlad2901 Data 7 octombrie 2011 22:32:36
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <cstdio>
#define NMAX 500000
#define KMAX 100001

int n, k, a, b;
//rest[i] = cate sume partiale intre start si i-a dau restul j la impartirea cu k
int rest[KMAX];
long long nr, sum[NMAX];

int main()
{
    int i, x, start;
    freopen("divk.in", "r", stdin);
    freopen("divk.out", "w", stdout);

    scanf("%d %d %d %d", &n, &k, &a, &b);

    for(i=1;i<=n;++i)
    {
        scanf("%d", &x);
        sum[i] = sum[i-1] + x;
    }

    start = 0;

    for(i=a;i<=n;++i)
    {
        rest[sum[i-a]%k]++; //pozitia i-a poate intra in secventa

        if(start < i-b) //pozitia minima de la care poate incepe secventa trebuie avansata
        {
            rest[sum[start]%k]--;
            start++;
        }
        nr += rest[sum[i]%k];
    }

    printf("%d", nr);

    return 0;
}