Cod sursa(job #614904)

Utilizator vlad2901Vlad Berindei vlad2901 Data 7 octombrie 2011 22:40:43
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 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);

    start = 0;

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

        if(i >= a)
        {
            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("%lld", nr);

    return 0;
}