Pagini recente » Cod sursa (job #720548) | Cod sursa (job #1180673) | Cod sursa (job #3167549) | Cod sursa (job #2242255) | Cod sursa (job #3161520)
#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;
}