Cod sursa(job #541621)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 25 februarie 2011 12:34:34
Problema Light2 Scor 30
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.65 kb
#include <fstream>
#include <queue>
#define nmax 25

using namespace std;

ifstream in("light2.in");
ofstream out("light2.out");

long long D[nmax];
int V[nmax],K;

class cmp
{
    public:
    inline bool operator()(int a,int b){return D[a]>D[b];}
};


priority_queue<int,vector<int> ,cmp>H;

int cmmdc(int a,int b)
{
    int r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}

long long calculeaza(int N)
{
    int i;
    //initializare
    while(!H.empty())H.pop();
    for(i=1;i<=K;i++)if(V[i]>0){D[i]=V[i],H.push(i);}
    if(H.empty())return 0;
    int nr=0,n_bec=0,nr_ant=-1,p;
    bool aprins=0;
    while(nr<=N)
    {
        p=H.top();
        H.pop();
        nr=D[p];
        if(nr>N)continue;
        D[p]+=V[p];
        H.push(p);
        if(nr_ant==nr&&aprins==1)
            n_bec--,aprins=0;
        else if(nr_ant==nr&&aprins==0)
            n_bec++,aprins=1;
        else n_bec++,aprins=1;
        nr_ant=nr;
    }
    return n_bec;
}

int main()
{
    int N,i;
    long long CMMMC=1;
    long long div;
    bool fail;
    in>>N>>K;
    for(i=1;i<=K;i++)
    {
        in>>V[i];
        fail = 0;
        for(div=1;div<i;div++)
            if(V[div]==V[i])V[div]=-1,fail = 1;
        if(fail)V[i]=-1;
        else {
        div=cmmdc(CMMMC,V[i]);
        CMMMC*=V[i]/div;}
    }
    //fac o data pana la CMMMC si inmultesc cu N/CMMMC
    //fac pana la N%CMMMC,le adun
    long long rez;
    if(N>CMMMC){
        rez = calculeaza(CMMMC);
    rez*=(N/CMMMC);
    rez+=calculeaza(N%CMMMC);}
    else    rez = calculeaza(N);
    out<<rez;
    return 0;
}