Pagini recente » Cod sursa (job #3228388) | Cod sursa (job #1541586) | Cod sursa (job #1196146) | Cod sursa (job #1868886) | Cod sursa (job #987317)
Cod sursa(job #987317)
#include <fstream>
#include <queue>
using namespace std;
typedef long long int64;
int64 N, K;
int64 D[24];
int64 result;
int64 Comb[24][24], C[24];
inline int64 cmmdc(int64 a, int64 b)
{
if (b == 0) return a;
return cmmdc(b, a % b);
}
void Back(int64 cmmmc, int level, int elems)
{
if (cmmmc > N) return;
if (level == K + 1) return;
Back(cmmmc, level + 1, elems);
cmmmc = cmmmc / cmmdc(cmmmc, D[level]) * D[level];
result += N / cmmmc * C[elems];
Back(cmmmc, level + 1, elems + 1);
}
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 < i)
C[i] += Comb[i][j] * C[j];
}
if (i % 2 == 0)
C[i] = - C[i];
else
C[i] = 1 - C[i];
}
fin >> N >> K;
for (int i = 1; i <= K; ++i)
fin >> D[i];
Back(1, 1, 1);
fout << result << '\n';
fin.close();
fout.close();
}