Cod sursa(job #1226809)

Utilizator diana97Diana Ghinea diana97 Data 8 septembrie 2014 10:37:28
Problema Multiplu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

ifstream f ("multiplu.in");
ofstream g ("multiplu.out");

const int MMAX = 2000000;

int m, x;
//pair <int, int> rest[MMAX]; //first: cifra, second: rest anterior
int c[MMAX], prev[MMAX];
//queue < pair <int, int> > q;
pair <int, int> q[MMAX + 1];

inline int cmmdc(int a, int b) {
    if (b == 0) return a;
    return cmmdc(b, a % b);
}

inline void scrie(int k) {
    if (k != x) scrie(prev[k]);
    //cout << rest[x].second << ' ';
    g << c[k];
}


void rezolva() {
    bool done = false;
    int r, r2, prim = 1, ultim = 1;
    pair <int, int> p;
    x = 1 % m;
    //cout << x;
    c[x] = 1;
    prev[x] = 0;
    q[ultim] = make_pair(c[x], prev[x]);
    while (!done && prim <= ultim) {
        p = q[prim];
        r = (p.first + p.second * 10) % m;
        //cout << r << ' ';
        //q.pop();
        prim++;
        if (r == 0) done = true;
        else {
            r2 = r * 10 % m;
            if (prev[r2] == 0 && r2 != x) {
                c[r2] = 0;
                prev[r2] = r;
                //q.push(rest[r2]);
                q[++ultim] = make_pair(c[r2], prev[r2]);
                if (r2 == 0) done = true;
            }
            r2 = (r * 10 + 1) % m;
            if (prev[r2] == 0 && r2 != x) {
                c[r2] = 1;
                prev[r2] = r;
                q[++ultim] = make_pair(c[r2], prev[r2]);
                if (r2 == 0) done = true;
            }
        }
    }
}

int main () {
    int a, b;
    f >> a >> b;
    m = a * b / cmmdc(a, b);
    rezolva();
    scrie(0);
    return 0;
}