Cod sursa(job #391528)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 5 februarie 2010 20:31:15
Problema Multiplu Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define NMAX 2000010
bool D[NMAX];
int v[NMAX], pre[NMAX];
char sol[NMAX];
int m, nr;
int cmmdc(int a,int b){
	if(a % b == 0)
		return b;
	return cmmdc(b, a%b);
}
void adauga(int x,int c){
	int p = (x*10 + c)%m;
	if(D[p]) return;
	D[p] = 1;
	v[++v[0]] = p;
	pre[p] = c + (x << 1);
}
int main(){
	freopen("multiplu.in", "r", stdin);
	freopen("multiplu.out", "w", stdout);
	int a, b;
	scanf("%d%d", &a, &b);
	m = a/cmmdc(a,b) * b;
	v[++v[0]] = 1;
	for(int i = 1; v[v[0]]; ++i){
		adauga(v[i], 0);
		if(!v[v[0]]) break;
		adauga(v[i], 1);
	}
	int x = 0;
	while(pre[x]){
		sol[++nr] = (pre[x]&1) + '0';
		x = pre[x] >> 1;
	}
	sol[++nr] = '1';
	reverse(sol + 1, sol + nr + 1);
	printf("%s\n",sol+1);
}