Cod sursa(job #3247688)

Utilizator paull122Paul Ion paull122 Data 8 octombrie 2024 19:59:47
Problema Multiplu Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

#define VMAX 50000
#define NMAX 20000010

#define LOG 19
#define INF (long long)(1e9)
#define MOD 123457
#define ll long long int

#define ADD 1e9

#define NIL 0




using namespace std;
ifstream fin("multiplu.in");
ofstream fout("multiplu.out");

queue<pair<int,int>> Q;
int p[NMAX+1],cif[NMAX+1];
bool inQ[NMAX+1];

int a,b;

int gcd(int x,int y)
{
    while(y)
    {
        int r = x%y;
        x=y;
        y=r;
    }
    return x;
}
int main()
{
    fin >> a >> b;
    int m = a*b/gcd(a,b);
    int k=1;
    inQ[1]=1;
    cif[1]=1;
    p[1]=0;
    Q.push({1,1});

    int res=0;
    while(!Q.empty() && !res)
    {
        int r = Q.front().first;
        int x = Q.front().second;
        inQ[r]=0;
        Q.pop();
        if(r==0)
        {
            res=x;
        }
        else
        {
            if(!inQ[r*10%m])
            {
                ++k;
                Q.push({r*10%m,k});
                cif[k]=0;
                p[k]=x;
                inQ[r*10%m]=1;
            }

            if(!inQ[(r*10+1)%m])
            {
                ++k;
                Q.push({(r*10+1)%m,k});
                cif[k]=1;
                p[k]=x;
                inQ[(r*10+1)%m]=1;
            }

        }
    }
    vector<int> num;
    while(res)
    {
        num.push_back(cif[res]);
        res = p[res];
    }
    reverse(num.begin(),num.end());
    for(int i : num)
    {
        fout << i;
    }
}