Cod sursa(job #2785101)

Utilizator lucamLuca Mazilescu lucam Data 17 octombrie 2021 23:21:31
Problema Multiplu Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

#ifdef ONLINE_JUDGE
#define in std::cin
#define out std::cout
#else
std::ifstream in("multiplu.in");
std::ofstream out("multiplu.out");
#endif

template<typename T, size_t N>
constexpr size_t length_of(T (&)[N]) { return N; }

constexpr int N = 2e6;
int dp[N];
int prev[N];
std::bitset<N> digit;

void bfs(int mod) {
    std::queue<int> q{{1}};
    dp[1] = 1; 
    prev[1] = -1;
    digit[1] = 1;
    bool found = false;
    while (!(q.empty() || found)) {
        int u = q.front();
        q.pop();
        auto visit = [&](bool dig) {
            int v = (u * 10 + dig) % mod;
            if (dp[v] != 0 && dp[v] <= dp[u] + 1) return;
            dp[v] = dp[u] + 1;
            q.push(v);
            prev[v] = u;
            digit[v] = dig;
        };
        visit(0);
        visit(1);
    }
}

int main() {
    int a, b;
    in >> a >> b;
    auto lcm = int(1ll * a * b / std::__gcd(a, b));
    std::fill(prev, prev + length_of(prev), -1);
    bfs(lcm);
    std::stack<bool> number;
    for (int i = 0; i != -1; i = prev[i]) {
        number.push(digit[i]);
    }
    while (!number.empty()) {
        out << number.top();
        number.pop();
    }
}