Cod sursa(job #543765)

Utilizator bora_marianBora marian bora_marian Data 28 februarie 2011 16:15:08
Problema Light2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
using namespace std;
long long cmc[(1<<21)+2],N;
long long sol,usor;
int d[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(i<=(1<<21))
		{
		  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]);
		 }
		 else
		 {
			 if(nr==1)
			   usor=d[maxim+1];
			 else
			   usor=cmmmc(cmc[i-(1<<maxim)],d[maxim+1]);
			 if(nr%2==1)
			   sol+=(long long)(1<<(nr-1))*(N/usor);
			 else
			   sol-=(long long)(1<<(nr-1))*(N/usor);
		   }      
			   
		//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;
 }