Cod sursa(job #117195)

Utilizator a7893Nae Mihai a7893 Data 20 decembrie 2007 21:56:00
Problema Multiplu Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#define N 300000
int a,b,m,c[N],use0[N],use1[N],up[N],cif[N];
int cmmmc(int x,int y)
{
	int r,cx,cy;
	cx=x;
	cy=y;
	while(y)
	{
		r=x%y;
		x=y;
		y=r;
	}
	return cx*cy/x;
}
int gasit_0(int x,int sf)
{
	int i;
	for(i=1;i<=sf;++i)
		if(c[i]%m==(x*10)%m)
			return 0;
	return 1;
}
int gasit_1(int x,int sf)
{
	int i;
	for(i=1;i<=sf;++i)
		if(c[i]%m==(x*10+1)%m)
			return 0;
	return 1;
}
int refa(int sf)
{
	int i,cc[N],k1=0,x=0;
	cc[++k1]=cif[sf];
	i=up[sf];
	while(i)
	{
		cc[++k1]=cif[i];
		i=up[i];
	}
	for(i=k1;i>=1;i--)
		x=x*10+cc[i];
	return x;
}
void solve()
{
	int ic,sf,aux;
	m=cmmmc(a,b);
	c[1]=1;
	up[1]=0;
	cif[1]=1;
	ic=sf=1;
	while(ic<=sf)
	{
		/*if(gasit_0(c[ic],sf))
		{
			c[++sf]=c[ic]*10+0;
			up[sf]=ic;
			cif[sf]=0;
		}
		if(gasit_1(c[ic],sf))
		{
			c[++sf]=c[ic]*10+1;
			up[sf]=ic;
			cif[sf]=1;
		}*/
		aux=refa(ic);
		if(!use0[(aux*10)%m])
		{
			c[++sf]=(aux*10)%m;
			up[sf]=ic;
			cif[sf]=0;
			use0[(aux*10)%m]=1;
		}
		if(!use1[(aux*10+1)%m])
		{
			c[++sf]=(aux*10+1)%m;
			up[sf]=ic;
			cif[sf]=1;
			use1[(aux*10+1)%m]=1;
		}
		if(c[ic]==0)
		{
			printf("%d\n",aux);
			return;
		}
		ic++;
	}
}
int main()
{
	freopen("multiplu.in","r",stdin);
	freopen("multiplu.out","w",stdout);
	scanf("%d%d",&a,&b);
	solve();
	return 0;
}