Pagini recente » Cod sursa (job #665390) | Cod sursa (job #285171) | Cod sursa (job #382229) | Cod sursa (job #3249294) | Cod sursa (job #655351)
Cod sursa(job #655351)
#include <fstream>
using namespace std;
typedef long long int64;
int64 N, K;
int D[24];
int64 result;
int64 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];
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();
}