Cod sursa(job #1197097)

Utilizator AndreiDumitrescuAndrei Dumitrescu AndreiDumitrescu Data 10 iunie 2014 19:51:01
Problema Divk Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>

using namespace std;

int *sume, *rest, n, k, A, B, *cate;

/*
Se da un sir de n numere. Sa se afiseze cate secvente cu lungimea cuprinsa intre A si B, inclusiv, ce se impart exact la k exista.
Iddea de la secvaenta de suma maxima : fac S_i = suma primelor i elemente. Daca am doua sume ce imi dau acelasi rest, atunci dif
dintre ele inseamna ca imi da o secventa cu suma divizibila cu k. Folosesc 2 vct desi este suficient unul singur.
in cate[i] retin de cate ori apare restul i in secventa pe care o analizez;
*/




void citeste()
{
    ifstream f("divk.in");
    f >> n >> k >> A >> B;
    sume = new int[n+1];
    rest = new int[n+1];
    cate = new int[n+1];
    f >> sume[1];
    rest[1] = sume[1] % k;
    cate[0] = cate[1] = 0;
    rest[0] = 0;
    int i, x, j;
    for(i = 2; i <= n; ++i)
    {
        f >> x;
        sume[i] = sume[i - 1] + x;
        rest[i] = sume[i] % k;
        cate[i] = 0;
    }

    f.close();
}



void dinamica()
{
    ofstream g("divk.out");
    int cnt = 0, i ;
    //cout << "resturi :" << endl;
    for(i = 1; i <= n; ++i)
     //   cout << rest[i] << " ";
    citeste();
    //cout << endl;

    for(i = 1; i  <= n; ++i)
    {
        if (i - B - 1 >= 0)
            {
                int calc = i - B - 1;
              //  cout << "i = " << i << endl;
              //  cout << "rest[" << calc << "] = " << rest[calc] << endl;
              //  cout <<"inainte, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
                --cate[rest[calc]];
             //   cout <<"dupa, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;

            }
        if (i - A >= 0)
            {
                int calc = i - A;
             //   cout << "-->i = " << i << endl;
             //   cout << "-->rest[" << calc << "] = " << rest[calc] << endl;
             //   cout <<"-->inainte, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
                ++cate[rest[calc]];
             //   cout <<"-->dupa, cate[" << rest[calc] << "] = " << cate[rest[calc]] <<endl;
            }

        cnt += cate[rest[i]];
        //cin.get();

    }
   // cout << cnt << endl;
    g << cnt << endl;
}


int main()
{
    citeste();
    dinamica();
    return 0;
}