Pagini recente » Cod sursa (job #2690237) | Cod sursa (job #1213068) | Cod sursa (job #536885) | Cod sursa (job #2326913) | Cod sursa (job #655374)
Cod sursa(job #655374)
#include <fstream>
#include <queue>
using namespace std;
typedef long long int64;
int64 N, K;
int D[24];
int64 result;
int64 Comb[24][24], C[24][24];
char nrb[1 << 22], log[1 << 22];
int64 val[1 << 22];
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");
for (int i = 1; i < (1 << 22); ++i)
{
nrb[i] = nrb[i & (i - 1)] + 1;
if (i >= 2) log[i] = log[i >> 1] + 1;
}
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];
val[0] = 1;
for (int i = 1; i < (1 << K); ++i)
{
val[i] = val[i & (i - 1)];
int last = log[i & -i];
if (val[i] == -1) continue;
val[i] = val[i] / cmmdc(val[i], D[last + 1]) * D[last + 1];
if (val[i] > N) val[i] = -1;
if (val[i] == -1) continue;
result += (-C[nrb[i]][nrb[i] - 1] + nrb[i] % 2) * (N / val[i]);
}
/*
int i = log[newval];
int64 valnow = val;
valnow = valnow / cmmdc(valnow, D[i + 1]) * D[i + 1];
if (valnow > N) continue;
aux[now | (1 << i)] = true;
Q1.push(newval);
Q2.push(valnow);
result += (-C[nrb[now] + 1][nrb[now]] + (nrb[now] + 1) % 2) * (N / valnow);
*/
fout << result;
fin.close();
fout.close();
}