Cod sursa(job #733586)

Utilizator danalex97Dan H Alexandru danalex97 Data 12 aprilie 2012 16:44:08
Problema Multiplu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
/*
#include <fstream>
#include <deque>
using namespace std;

ifstream F("multiplu.in");
ofstream G("multiplu.out");
#define Qu(x) x.close();
void Cf(){Qu(F)Qu(G)}

#define ll long long
#define AB 2000011
#define Coada deque<int>

int A,B,Mod;
int Nbr;
bool ok[AB];
int Back[AB],Act[AB];
Coada Q,T,Sec;

inline int cmmdc(int A,int B)
{ return ( B==0 ) ? A : cmmdc( B, A%B ); }

inline int cmmmc(int A,int B)
{ return A*B/cmmdc(A,B); }

int main(void)
{
	F>>A>>B;
	Mod=cmmmc(A,B);
	
	ok[1]=1;
	
	Q.push_front(1);
	T.push_front(0);
	
	while ( !ok[0] )
	{
		while ( !Q.empty() )
		{
			Back[ Q.front() ]= T.front() ;
			Q.pop_front();
			Sec.push_front( Q.front() );
			T.pop_front();
		}
		while ( !Sec.empty() )
		{
			int El2=Sec.front();
			int El=El2*10; 
			El= ( El>Mod )? El-Mod : El ; 
			
			if ( ! ok[El] )
			{				
				Act[ El ]=0;
				Q.push_front( El );
				T.push_front( El2 );
			}
			
			El=El2*10+1;
			El= ( El>Mod )? El-Mod : El ; 
			
			if ( ! ok[El] )
			{				
				Act[ El ]=1;
				Q.push_front( El );
				T.push_front( El2 );
			}
			
			Sec.pop_front();
		}
	}
	
	Cf();
}
*/

#include <cstdio>
using namespace std;

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

inline 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);
	
	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];

		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");
	else
	{
		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;
}