Cod sursa(job #1329559)

Utilizator PikachuPikachu Pikachu Data 29 ianuarie 2015 17:16:31
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>

using namespace std;

int fact[20], expp[20];
int M;

void desc(int n, int q) {
	int d, e;
	d = 2;

	while(n > 1 && 1LL * d * d <= n) {
		e = 0;
		while(n % d == 0) {
			n /= d;
			++ e;
		}
		if(e) {
			fact[++ M] = d;
			expp[M] = e * q;
		}
		++ d;
		if(!(d & 1))
			++ d;
	}
	if(n > 1) {
		fact[++ M] = n;
		expp[M] = q;
	}
}

bool ok(long long n, int p, int e) {
	long long pp = 0;
	while(n) {
		pp = pp + n / p;
		n /= p;
	}
	if(pp >= e)
		return 1;
	return 0;
}

long long bin(int p, int e) {
	long long med, last = -1, st = 1, dr = 1LL << 60;
	while(st <= dr) {
		med = st + (dr - st) / 2;
		if(ok(med, p, e)) {
			last = med;
			dr = med - 1;
		} else {
			st = med + 1;
		}
	}
	return last;
}

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

	int p, q;
	long long pq, rasp = 0;
	scanf("%d%d", &p, &q);

	desc(p, q);

	for(int i = 1; i <= M; ++ i) {
		pq = bin(fact[i], expp[i]);
		if(pq > rasp) {
			rasp = pq;
		}
	}

	printf("%lld\n", rasp);

	return 0;
}