Cod sursa(job #115064)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 16 decembrie 2007 10:35:51
Problema Multiplu Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 1.11 kb
#include <stdio.h>

int cmmdc(int a, int b)
{
	if (a % b == 0)
		return b;
	
	return cmmdc(b, a % b);
}

int cmmmc(int a, int b)
{
	return (a * b) / cmmdc(a, b);
}

#define LMAX 2000100

int i, a, b, li, ls, r, rnext;
int prev[LMAX], q[LMAX];
char digit[LMAX];

int main()
{
	freopen("multiplu.in", "r", stdin);
	scanf("%d %d", &a, &b);
	
	a = cmmmc(a, b);

	//fprintf(stderr, "a=%d\n", a);
	
	for (i = 0; i < a; i++)
		prev[i] = -2;
	
	prev[1 % a] = -1;
	digit[1 % a] = 1;
	li = ls = 0;
	q[li] = 1 % a;
	
	while (prev[0] < -1 && li <= ls)
	{
		r = q[li];

		// add the digits 0 & 1
		
		for (i = 0; i <= 1; i++)
		{
			rnext = (10 * r + i) % a;
		
			if (prev[rnext] < -1)
			{
				prev[rnext] = r;
				digit[rnext] = (char) i;
			
				ls++;
				q[ls] = rnext;
			}
		}
				
		li++;
	}
	
	freopen("multiplu.out", "w", stdout);
	
	if (prev[0] < -1)
		printf("0\n"); // this should never happen
	else
	{
		// reconstituie solutia
		i = 0;
		
		r = 0;
		while (prev[r] >= 0)
		{
			i++;
			q[i] = (int) digit[r];
			r = prev[r];
		}
		
		i++;
		q[i] = 1;
		
		for (; i > 0; i--)
			printf("%d", q[i]);
		printf("\n");
	}
	
	return 0;
}