Mai intai trebuie sa te autentifici.
Cod sursa(job #708340)
Utilizator | Data | 6 martie 2012 18:55:24 | |
---|---|---|---|
Problema | Light2 | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 0.96 kb |
#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();
}