Cod sursa(job #2299168)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 8 decembrie 2018 23:59:40
Problema Multiplu Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <queue>
#include <bitset>
#define DIM 2000005
#define DIMBUFF 1000005

using namespace std;

FILE *fin  = fopen ("multiplu.in", "r");
FILE *fout = fopen ("multiplu.out", "w");

int a, b, m, x, k, i, p, nr, cnt, ok, pp;
int cif[DIM], sol[DIM], ant[DIM];

queue <int> q;

bitset <DIM> v;

char buff[DIMBUFF];

int numar() {
    int val = 0;
    while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    while (buff[pp] >= '0' && buff[pp] <= '9') {
        val = val*10 + buff[pp] - '0';
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    return val;
}

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

int main(){
    a = numar (), b = numar ();
    if (a*b == 1){
        fprintf (fout, "1");
        return 0;
    }
    m = (a*b)/cmmdc(a, b); /// m = cmmmc (a, b)
    q.push(1); /// in q am cele mai mici numere formate cu 0 si 1 care dau un anumit rest la impartirea cu m (introduc, de fapt, resturile lor la m - in numar de maxim m-1)
    v[1] = 1; /// viz
    cif[1] = 1; /// tip
    ant[1] = -1; /// anterior
    while (!q.empty()){
        k = q.front();
        q.pop();
        for (i=0; i<=1; i++){
            p = (10*k + i)%m;
            if (!v[p]){
                v[p] = 1;
                ant[p] = k;
                cif[p] = i;
                q.push(p);
            }
        }
    }
    while(ok != -1) {
        sol[++nr] = cif[ok];
        ok = ant[ok];
    }
    for (i=nr; i>=1; i--){
        fprintf (fout, "%d", sol[i]);
    }
    return 0;
}