Cod sursa(job #2966661)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 18 ianuarie 2023 08:03:50
Problema Multiplu Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("multiplu.in");
ofstream cout("multiplu.out");

const int NMAX = 2e6;
string inf = "2000000000000000000000000000000";

queue <string> q;
string min_num[NMAX + 1];
int cmmmc;

int cmmdc(int x, int y){

    int r = 0;
    while(y){

        r = x % y;
        x = y;
        y = r;

    }

    return x;
}

int modulo(string x, int p){

    int ans = 0;
    for(int i = 0; x[i]; i++){

        ans = ans * 10 + (x[i] - 48);
        ans %= p;

    }

    return ans;

}

bool mai_mare(string a, string b){

    if(a.size() < b.size())
        return 0;

    if(a.size() > b.size())
        return 1;

    for(int i = 0; a[i]; i++)
        if(a[i] < b[i])
            return 0;

    return 1;
}

void bfs(string x){

    q.push(x);
    min_num[1] = "1";

    while(!q.empty()){

        string x = q.front();
        q.pop();

        // ma duc fie in rest r, fie in rest r + 1

        int rm = modulo(x, cmmmc);
        min_num[rm] = x;
        //cout << x << " cu restul " << rm << "\n";

        if(rm == 0)
            return;

        rm *= 10;
        rm %= cmmmc;

        
        if(mai_mare(min_num[rm], x + "0")){
            
            min_num[rm] = x + "0";
            q.push(x + "0");
        
        }

        rm = rm * 10 + 1;
        rm %= cmmmc;

        if(mai_mare(min_num[rm], x + "1")){
            
            min_num[rm] = x + "1";
            q.push(x + "1");
        
        }
        

    }

}

int main(){

    int x = 0, y = 0;
    cin >> x >> y;

    if(x == y){

        cout << x;
        return 0;

    }

    cmmmc = x * y / cmmdc(x, y);
    
    for(int i = 0; i < cmmmc; i++)
        min_num[i] = inf;

    bfs("1");
    cout << min_num[0];

}