Cod sursa(job #397790)

Utilizator toniobFMI - Barbalau Antonio toniob Data 17 februarie 2010 15:12:42
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>

const int NMax = 1 << 30;
int A, Q;

int minim (int a, int b) {
	return a < b ? a : b;
}

bool rau (int p1, int p2) {
	return p2 * Q > p1;
}

int put (int n, int p) {
	int rez = 0;
	while (n) {
		rez += n / p;
		n /= p;
	}
	return rez;
}

bool desc (int x,int a) {
	int p1, p2;
	for (int i = 2;  i * i <= a; ++i) {
		if (!(a % i)) {
			p1 = put (x, i);
			p2 = 0;
			while (!(a % i)) {
				++p2;
				a /= i;
			}
			if(rau(p1,p2))
				return false;
		}
	}
	if (a != 1) {
		p1 = put (x,a);
		p2 = 1;
		if(rau(p1,p2))
			return false;
	}

	return true;
}

int BS () {
	int i, pas = 1 << 30;
	for (i = 0; pas; pas >>= 1) {
		if (!desc(i + pas,A)) {
			i += pas;
		}
	}
	return i + 1;
}

int main () {
	freopen ("gfact.in", "r", stdin);
	freopen ("gfact.out", "w", stdout);

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

	printf ("%d", BS ());

	return 0;
}