Cod sursa(job #1570289)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 16 ianuarie 2016 12:30:31
Problema Divk Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <stdlib.h>
int v[500001],s[500001],lista[500001],next[500001],aux[500001];
int main()
{
    int n,k,a,b,i,nr,ct,j;
    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",&v[i]);
        s[i]=(s[i-1]+v[i])%k;
    }
    for(i=0; i<k; i++)
        aux[i]=lista[i]=-1;
    aux[0]=-1;
    for(i=0; i<=n; i++)
    {
        if(aux[s[i]]==-1)
        {
            lista[s[i]]=i;
            aux[s[i]]=i;
            next[i]=n+1;
        }
        else
        {
            next[aux[s[i]]]=i;
            aux[s[i]]=i;
            next[i]=n+1;
        }
    }
    nr=0;
    for(ct=0; ct<k; ct++)
    {
        if(lista[ct]>-1){
            i=j=lista[ct];
            while(next[j]!=n+1 && j-i<=b){
                if(j-i>=a)
                    nr++;
                j=next[j];
            }
            if(j-i>=a && j-i<=b)
                nr++;
            while(j!=n+1)
            {
                i=next[i];
                while(j-i>=a)
                {
                    if(j-i<=b)
                        nr++;
                    i=next[i];
                }
                j=next[j];
            }
        }
    }
    printf("%d\n",nr);

    return 0;
}