Cod sursa(job #115817)

Utilizator mithyPopovici Adrian mithy Data 16 decembrie 2007 23:35:32
Problema Multiplu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <vector>
#define NMax 2000100

long A, B;
FILE *f, *g;

int C[NMax], rest[NMax], x;
int up[NMax], cif[NMax];
char solx[NMax];
int in, sf;

void citire();
void rez();
long cmmdc( long A, long B );

int main()
{
	citire();
	rez();
	return 0;
}
void rez()
{
	int i, n;
	long M = A*B /cmmdc( A, B ), poz, pozb;
	std::vector<int> sol;

	C[0] = 1;
	rest[1%M] = 1;
	while ( 1 )
	{
		poz = in;
		x = C[in++];
		rest[(x%M)] = 0;

		if (  x%M == 0 )
		{
			pozb = in-1;
			break;
		}

		if ( rest[(x*10)%M] == 0 )
		{
			C[++sf]        = (x*10)%M;
			rest[(x*10)%M] = 1;
			cif[sf]		   = 0;
			up[sf]		   = poz;

			if ( C[sf] == 0 )
			{
				pozb = sf;
				break;
			}
		}


		if ( rest[(x*10+1)%M] == 0)
		{
			C[++sf]          = (x*10+1)%M;
			rest[(x*10+1)%M] = 1;
			cif[sf]		     = 1;
			up[sf]		     = poz;

			if ( C[sf] == 0 )
			{
				pozb = sf;
				break;
			}
		}
	}

	n=0;
//	sol.push_back( cif[pozb] );
	solx[0] = cif[pozb] + '0';
	n++;
	while ( up[pozb] )
	{
//		sol.push_back( cif[up[pozb]] );
		solx[n] = cif[up[pozb]] + '0' ;
		up[pozb] = up[up[pozb]];
		n++;
	}
	solx[n] = 1 + '0' ;
//	sol.push_back( 1 );
	n++;
	
// 	for (i=n-1; i>=0; i--)
// 		fprintf( g, "%d", sol[i] );
// 	fprintf( g, "\n" );

 	for (i=n-1; i>=0; i--)
 		fprintf( g, "%d", solx[i]-'0' );
	fprintf( g, "\n" );
}
long cmmdc( long A, long B )
{
	long R;
	while ( B )
	{
		R = A % B;
		A = B;
		B = R;
	}
	return A;
}
void citire()
{
	f = fopen( "multiplu.in", "rt" );
	g = fopen( "multiplu.out", "wt" );

	fscanf( f, "%ld %ld", &A, &B );
	fclose( f );
}