Cod sursa(job #87527)

Utilizator bogdan25bogdan25 bogdan25 Data 27 septembrie 2007 18:36:49
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <cstdlib>
#include <vector.h>

#define max 500000


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

int a[max],n, aa,bb,k, s[max];
//pnod *v[100000];
vector <int> w[100000];


void citire()
{
        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];
        }

        w[0].push_back(0);
        for (int i = 1; i <=n; i++)
            w[ s[i] % k ].push_back(i);

        fclose(stdin);
}

int calc(int lung)
{
        int nr = 0;

        for (int i = 0; i<k; i++)
        {
            int p1 = 0, p2 =0;
            int c1=1, c2=0;
            while ( p2 +1 < w[i].size()  )
            {
                //muta dreapta

                for (c2=0 ; p2<w[i].size() && w[i][p2] - w[i][p1] +1 <=lung; p2++)
                             c2++;
                p2--; c2--;
                nr+=c1 * c2 + c2 * (c2-1) / 2;
                p1++; c1+=(c2-1);
                if (p2 < p1 ) { p2 = p1; c1 = 1; };
            }

        }
        return nr;
}


int main()
{
        citire();

        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("%d", rez);
        fclose(stdout);

}