Cod sursa(job #2736736)

Utilizator KPP17Popescu Paul KPP17 Data 3 aprilie 2021 20:21:47
Problema Indep Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#define mF "indep"
std::ifstream in(mF ".in");
std::ofstream out(mF ".out");
#include <vector>
using LL = long long; using V = std::vector<LL>;
constexpr LL Z = 1e18, N = 501; int X[N]; V P[N] = {{}, {1}};
void U(V& A, size_t i, bool e) {if (i+1 == A.size()) A.push_back(e); else A[i+1] += e;}
void I(V& A, size_t i, LL e) {if (A[i] += e, Z <= A[i]) A[i] -= Z, U(A, i, 1); else U(A, i, 0);}
void S(V& A, const V& B) {if (A.empty()) A.push_back(0); for (size_t i = 0, j = std::max(A.size(), B.size()); i < j; i++)
I(A, i, B.size() <= i? 0: B[i]); if (!A.back()) A.pop_back();}
constexpr int C(LL e) {return e < 10? 1: C(e / 10) + 1;}
void M(V& A, const V& B) {bool b = 0; for (size_t i = 0; i < B.size(); i++) if (B[i] + b <= A[i]) A[i] -= B[i] + b, b = 0;
else A[i] += Z - B[i], b = 1; if (b) A[B.size()]--; while (A.size() and !A.back()) A.pop_back();}
#include <utility>
#define x first
#define y second
int main()
{
    int n, m = 1; in >> n; for (int i = 0; i < n; i++) in >> X[i], m = std::max(m, X[i]);
    for (int i = 2; i <= n; i++) P[i] = P[i-1], S(P[i], P[i-1]), S(P[i], {1});
    std::vector<std::pair<int, int>> F; for (int i = 2, b, n, k; b = true, n = 0, k = i, i <= m; i++) {
        for (int j = 2, e; k != 1; j++) {for (e = 0; !(k % j); e++) k /= j; if (1 < e) b = false; if (e) n++;}
        if (b) F.push_back({i, n});}
    V A, B; for (auto p: F) {int c = 0; for (int i = 0; i < n; i++) if (!(X[i] % p.x)) c++; if (p.y & 1) S(A, P[c]); else S(B, P[c]);}
    M(A, B); M(P[n], A); if (!P[n].size()) out << 0; else
    if (P[n].empty()) out << 0; else while (out << P[n].back(), P[n].pop_back(), P[n].size()) for (int i = C(Z) - C(P[n].back()); --i;) out << 0;
}