Cod sursa(job #541762)

Utilizator ChallengeMurtaza Alexandru Challenge Data 25 februarie 2011 14:04:20
Problema Light2 Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.17 kb
#include <fstream>
#include <algorithm>

using namespace std;

const char InFile[]="light2.in";
const char OutFile[]="light2.out";
const int MaxK=32;
const int INF=-1;

ifstream fin(InFile);
ofstream fout(OutFile);

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

inline long long cmmmc(long long a, long long b)
{
	return (a*b)/cmmdc(a,b);
}

int T[MaxK],D[MaxK],K;
long long N,sol;

int main()
{
	fin>>N>>K;
	for(register int i=1;i<=K;++i)
	{
		fin>>T[i];
	}
	fin.close();
	
	sort(T+1,T+1+K);
	for(register int i=1;i<=K;++i)
	{
		if(D[D[0]]!=T[i])
		{
			D[++D[0]]=T[i];
		}
		else if(D[0]>0)
		{
			--D[0];
		}
	}
	
	int maxcfg=1<<D[0];
	for(register int cfg=1;cfg<maxcfg;++cfg)
	{
		int nrone=0;
		long long CMMMC=1;
		int tcfg=cfg;
		for(register int i=1;i<=D[0];++i,tcfg>>=1)
		{
			if((tcfg&1)==1)
			{
				++nrone;
				CMMMC=cmmmc(CMMMC,(long long)(D[i]));
				if(CMMMC>N)
				{
					break;
				}
			}
		}
		if((nrone&1)==1)
		{
			sol+=N/CMMMC;
		}
		else
		{
			sol-=((N/CMMMC)<<1);
		}
	}
	
	fout<<sol;
	fout.close();
	return 0;
}