Pagini recente » Cod sursa (job #318919) | Cod sursa (job #1616944) | Cod sursa (job #3141176) | Cod sursa (job #1864578) | Cod sursa (job #543607)
Cod sursa(job #543607)
#include<fstream>
using namespace std;
long long cmc[4200000],N,put[25],k,sol;
int d[30];
void precalculare();
void solve();
long long cmmmc(long long a,long long b);
long long cmmdc(long long a,long long b);
ofstream fout("light2.out");
int main()
{
ifstream fin("light2.in");
fin>>N;
int i;
fin>>k;
for(i=1;i<=k;i++)
fin>>d[i];
//fout<<k;
precalculare();
solve();
fout<<sol;
return 0;
}
void solve()
{
long long nrpasi=(1<<k)-1,i,j;
for(i=1;i<=nrpasi;i++)
{
long long nr=0,maxim=0,numar=0;
for(j=0;j<k;j++)
if((1<<j) & i)
{
nr++;
numar+=put[j];
if(j>maxim)
maxim=j;
}
if(nr==1)
cmc[numar]=d[maxim+1];
else
cmc[numar]=cmmmc(cmc[numar-put[maxim]],d[maxim+1]);
if(nr%2==1)
sol+=put[nr-1]*(long long)N/cmc[numar];
else
sol-=put[nr-1]*(long long)N/cmc[numar];
}
}
void precalculare()
{
put[0]=1;
int i;
for(i=1;i<=k;i++)
put[i]=put[i-1]*2;
}
long long cmmmc(long long a,long long b)
{
long long bau=(long long)(a*b)/cmmdc(a,b);
if(bau>N)
return N+20;
else
return bau;
}
long long cmmdc(long long a,long long b)
{
long long r;
do{
r=a%b;
a=b;
b=r;
}
while(r);
return a;
}