Cod sursa(job #120477)

Utilizator gcosminGheorghe Cosmin gcosmin Data 5 ianuarie 2008 16:10:35
Problema Multiplu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <bitset>
using namespace std;

#define VMAX 2000010

int A, B, nr;

bitset <VMAX> ap;
int nvec;
int vec[VMAX];
unsigned char predp[VMAX];

int mod[3000];
char sol[3000];

inline int cmmdc(int a, int b) 
{
	return (!b) ? a : cmmdc(b, a % b);
}

int main()
{
	int i;

	freopen("multiplu.in", "r", stdin);
	freopen("multiplu.out", "w", stdout);

	scanf("%d %d", &A, &B);

	nr = A * B / cmmdc(A, B);

	int mx = 0;

	ap[0] = 1;
	vec[++nvec] = 0;

	mod[0] = 1;

	int q = 1, w = 0, nnvec, nval;
	while (1) {
		nnvec = nvec;
		for (i = 1; i <= nvec; i++) {
			nval = vec[i] + q;;
			if (nval > nr) nval -= nr;
			if (ap[nval] == 0) {
				vec[++nnvec] = nval;
				ap[nval] = 1;
				predp[nval] = w;
			}
		}

		nvec = nnvec;

		if (ap[nr] == 1) break;

		q = (q * 10) % nr;
		w++;
		mod[w] = q;
	}

	q = nr;

	int pmax = predp[q];

	if (pmax > mx) mx = pmax;

	while (q) {
		sol[predp[q]] = 1;
		q = q - mod[predp[q]];
		if (q < 0) q += nr;
	}

	for (i = pmax; i >= 0; i--) printf("%d", sol[i]);
	printf("\n");

return 0;
}