Cod sursa(job #1226539)

Utilizator diana97Diana Ghinea diana97 Data 5 septembrie 2014 23:22:24
Problema Multiplu Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 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
//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(rest[k].second);
    //cout << rest[x].second << ' ';
    g << rest[k].first;
}


void rezolva() {
    bool done = false;
    int r, r2, prim = 1, ultim = 1;
    pair <int, int> p;
    x = 1 % m;
    //cout << x;
    rest[x].first = 1;
    rest[x].second = 0;
    q[ultim] = rest[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 (rest[r2].second == 0 && r2 != x) {
                rest[r2].first = 0;
                rest[r2].second = r;
                //q.push(rest[r2]);
                q[++ultim] = rest[r2];
                if (r2 == 0) done = true;
            }
            r2 = (r * 10 + 1) % m;
            if (rest[r2].second == 0 && r2 != x) {
                rest[r2].first = 1;
                rest[r2].second = r;
                q[++ultim] = rest[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;
}