Pagini recente » Cod sursa (job #1522515) | Cod sursa (job #1044609) | Cod sursa (job #2227723) | Cod sursa (job #479467) | Cod sursa (job #2299208)
#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;
}