Cod sursa(job #968740)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 2 iulie 2013 18:12:48
Problema Divk Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <list>

using namespace std;

list<int> v[100005];
int main()
{
    ifstream fin("divk.in");
    ofstream fout("divk.out");

    int a,b,n,k,i,x,s=0;
    fin>>n>>k>>a>>b;
    v[0].push_back(0);
    for(i=1;i<=n;i++)
    {
        fin>>x;
        x%=k;
        s=(s+x)%k;
        //cout<<"avem rest "<<s[i]<<endl;
        v[s].push_back(i);
    }
    int sol=0,dif;
    list<int>::iterator it1,it2;
    int i1,i2;
    for(i=0;i<k;i++)
    {
        //cout<<"suntem in "<<i<<endl;
        it1=v[i].begin();
        it2=it1;
        i1=0;
        i2=1;
        it2++;
        //cout<<"incepem cu "<<*it1<<' '<<*it2<<endl;
        while(it1!=v[i].end() && it2!=v[i].end())
        {
            //cout<<"deci, "<<*it1<<' '<<*it2<<endl;
            dif=((*it2)-(*it1));
            if(dif>=a && dif<=b)
            {
                sol+=(i2-i1);
                it1++;
                i1++;
            }
            else if(dif>b)
                it1++,i1++;
            else if(dif<a)
                it2++,i2++;
        }
    }
    fout<<sol<<'\n';
    fin.close();
    fout.close();
    return 0;
}