Cod sursa(job #72725)

Utilizator andrei_infoMirestean Andrei andrei_info Data 15 iulie 2007 11:44:23
Problema Divk Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>

#define max 500000


typedef struct pnod{ int poz; pnod *next; } pnod;

int a[max],n, aa,bb,k;
long long int s[max];
pnod *v[100000];

void citire()
{
        pnod *p;

        freopen("divk.in", "r", stdin);
        scanf("%d %d %d %d\n", &n, &k, &aa, &bb);

        for (int i = 1; i<=n ; i++)
        {
                scanf("%d\n",&a[i]);
                s[i] = s[i-1] + a[i];
        }
        for (int i = n; i>0; i--)
        {
                p=new pnod;
                p->poz = i;
                p->next = v[s[i] % k];
                v[s[i] % k] = p;
        }
        fclose(stdin);
}

long long int calc(int lung)
{
        pnod *p1, *p2;
        long long int nr = 0, rez=0;
        int dif;
        for (int i = 0; i<k; i++, nr=0)
        {
                p1 = v[i];
                if (p1 == NULL ) continue;
                p2 = p1->next;
                dif = 0;
                while (p2 != NULL )
                {
                        while (p2 != NULL && p2->poz - p1->poz + 1 <=lung )
                        {
                                dif++;
                                nr+=dif;
                                p2 = p2->next;
                        }
                        p1 = p1->next;
                        dif--;
                }
                rez +=nr;
        }
        return rez;
}


int main()
{
        citire();

        long long int rez,r1,r2;
        r1=calc(bb);
        if (aa > 2)
        r2=calc(aa-1);
        else r2=0;
        rez = r1-r2;
        freopen("divk.out","w", stdout);
        printf("%lld", rez);
        fclose(stdout);

}