Pagini recente » Cod sursa (job #2215374) | Cod sursa (job #257871) | Cod sursa (job #2112170) | Cod sursa (job #1507580) | Cod sursa (job #541621)
Cod sursa(job #541621)
#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;
}