Cod sursa(job #3161520)

Utilizator juniorOvidiu Rosca junior Data 27 octombrie 2023 13:08:03
Problema Multiplu Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

int gcd(int a, int b) {
    while (b != 0) {
        int t = b;
        b = a % b;
        a = t;
    }
    return a;
}

int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

int main() {
    ifstream fin("multiplu.in");
    ofstream fout("multiplu.out");

    int A, B;
    fin >> A >> B;

    int M = lcm(A, B);  // Calculam cel mai mic multiplu comun pentru A si B
    vector<int> viz(M, -1);  // Vector pentru a verifica daca un rest a fost vizitat sau nu
    vector<int> up(M);  // Vector pentru a retine ultima pozitie
    vector<int> cif(M);  // Vector pentru a retine ultima cifra

    queue<int> q;
    q.push(1 % M);  // Introducem restul numarului 1 la impartirea cu M
    viz[1 % M] = 0;
    up[1 % M] = -1;
    cif[1 % M] = 1;

    while(!q.empty()) {
        int curr = q.front();
        q.pop();

        if(curr == 0) {  // Daca restul este 0, am gasit numarul
            vector<int> sol;
            for(int i = 0; curr != -1; curr = up[curr]) {
                sol.push_back(cif[curr]);
            }
            for(int i = sol.size() - 1; i >= 0; --i) {
                fout << sol[i];
            }
            fout << '\n';
            break;
        }

        int next = (curr * 10) % M;  // Adaugam cifra 0 la sfarsitul lui curr
        if(viz[next] == -1) {
            q.push(next);
            viz[next] = viz[curr] + 1;
            up[next] = curr;
            cif[next] = 0;
        }

        next = (curr * 10 + 1) % M;  // Adaugam cifra 1 la sfarsitul lui curr
        if(viz[next] == -1) {
            q.push(next);
            viz[next] = viz[curr] + 1;
            up[next] = curr;
            cif[next] = 1;
        }
    }

    fin.close();
    fout.close();

    return 0;
}