Cod sursa(job #2299208)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 9 decembrie 2018 01:08:45
Problema Multiplu Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <bitset>
#define DIM 2000005
#define DIMBUFF 1000005

using namespace std;

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

int cif[DIM], sol[DIM], ant[DIM], q[DIM];
int pp;

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(){
    int a, b, m, ok = 0, i, p, u, nr = 0;
    a = numar ();
    b = numar ();
    if (a*b == 1){
        fprintf (fout, "1");
        return 0;
    }
    m = a/cmmdc(a,b)*b; /// m = cmmmc (a, b)
    v[1] = 1; /// viz
    cif[1] = 1; /// tip
    ant[1] = -1; /// anterior
    q[1] = 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)
    p = u = 1;
    while (p <= u){
        int k = q[p];
        for (i=0; i<=1; i++){
            int p = (10*k + i)%m;
            if (v[p]){
                continue;
            }
            v[p] = 1;
            ant[p] = k;
            cif[p] = i;
            q[++u] = p;
            if (p == 0){
                break;
            }
        }
        p++;
    }
    while(ok != -1) {
        sol[++nr] = cif[ok];
        ok = ant[ok];
    }
    for (i=nr; i>=1; i--){
        fprintf (fout, "%d", sol[i]);
    }
    return 0;
}