Cod sursa(job #543743)

Utilizator bora_marianBora marian bora_marian Data 28 februarie 2011 15:57:41
Problema Light2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<fstream>
using namespace std;
long long cmc[1<<22];
long long sol;
int d[23],N,put[23],k;
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];
	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+=(1<<j);
			  if(j>maxim)
			    maxim=j;
			}
		if(nr==1)
		  cmc[i]=d[maxim+1];
		else
		  cmc[i]=cmmmc(cmc[i-(1<<maxim)],d[maxim+1]);
		if(nr%2==1)
		   sol+=(long long)(1<<(nr-1))*(N/cmc[i]);
		else
		   sol-=(long long)(1<<(nr-1))*(N/cmc[i]);
		//fout<<i<<" "<<nr<<" "<<sol<<" "<<cmc[numar]<<" "<<numar<<endl;             
	  }
}
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;
 }