Cod sursa(job #868752)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 31 ianuarie 2013 16:30:03
Problema Multiplu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>
#define mp make_pair
#define DN 2000100
using namespace std;

queue<pair<int,int> > q;
int prec[DN];
bool valoare[DN],viz[DN];
vector<int> x;

int cmmdc(int a,int b)
{
    int c;
    while(b)
    {
        c=a%b;
        a=b;
        b=c;
    }
    return a;
}

int main()
{
    int a,b,cmmmc,pozitie;
    ifstream f("multiplu.in");
    ofstream g("multiplu.out");
    f>>a>>b;

    cmmmc=a*b/cmmdc(a,b);

    q.push(mp(1,1));

    valoare[1]=1;
    prec[1]=-1;
   // prec[0]=-1;

    while(q.size())
    {
        int val=q.front().first;
        int poz=q.front().second;

        if(val==0)
        {
            pozitie=val;
            break;
        }
        q.pop();

        if(!viz[(val*10)%cmmmc])
        {
            prec[(val*10)%cmmmc]=val;
            valoare[(val*10)%cmmmc]=0;

           // valoare[++poz]=0;
           // prec[poz]=poz-1;
            q.push(mp( (val*10)%cmmmc , poz) );
            viz[(val*10)%cmmmc]=true;
        }


        if(!viz[(val*10+1)%cmmmc])
        {
             prec[(val*10+1)%cmmmc]=val;
             valoare[(val*10+1)%cmmmc]=1;

          //  valoare[++poz]=1;
          //  prec[poz]=poz-2;
            q.push(mp( (val*10+1)%cmmmc , poz) );
            viz[(val*10+1)%cmmmc]=true;
        }


    }
    while(prec[pozitie]!=-1)
    {
        x.push_back( valoare[pozitie] );
        pozitie=prec[pozitie];
    }
    g<<1;
    for(int i=x.size()-1;i>=0;--i)
        g<<x[i];

    return 0;
}