Cod sursa(job #655346)

Utilizator darrenRares Buhai darren Data 2 ianuarie 2012 12:57:01
Problema Light2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>

using namespace std;

typedef long long int64;

int64 N, K;
int D[24];
int64 result;
int Comb[24][24], C[24][24];

inline int64 cmmdc(int64 a, int64 b)
{
	if (b == 0) return a;
	return cmmdc(b, a % b);
}

int main()
{
	ifstream fin("light2.in");
	ofstream fout("light2.out");
	
	Comb[0][0] = 1;
	for (int i = 1; i <= 22; ++i)
	{
		Comb[i][0] = 1;
		for (int j = 1; j <= i; ++j)
		{
			Comb[i][j] = Comb[i - 1][j] + Comb[i - 1][j - 1];
			if (j % 2 == 0) C[i][j] = C[i][j - 1] - Comb[i][j] * (C[j][j - 1] + j % 2);
			else            C[i][j] = C[i][j - 1] + Comb[i][j] * (C[j][j - 1] + j % 2);
		}
	}
	
	fin >> N >> K;
	for (int i = 1; i <= K; ++i)
		fin >> D[i];
	
	for (int i = 1; i < (1 << K); ++i)
	{
		int64 numnow = 1;
		for (int j = 0; j < K; ++j)
			if (i & (1 << j))
			{
				numnow = numnow / cmmdc(numnow, D[j + 1]) * D[j + 1];
				if (numnow > N) break;
			}
		if (numnow > N) continue;
		
		int aux = i, nrb = 0;
		while (aux)
			aux &= aux - 1, ++nrb;
		
		result += (-C[nrb][nrb - 1] + nrb % 2) * (N / numnow);
	}
	
	fout << result;
	
	fin.close();
	fout.close();
}