Cod sursa(job #342532)

Utilizator savimSerban Andrei Stan savim Data 22 august 2009 11:04:51
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <math.h>

#define MAX_N 100

int p, q, d, n, ok;
int fact[MAX_N], put[MAX_N];
long long st, dr, mid, f, sol, nr;

void get_fact() {
	d = 1;
	while (p != 1) {
    	d++;

		if (p % d == 0) fact[++n] = d;
		while (p % d == 0) {
			p /= d;
			put[n] += q;
		}

		if (d > sqrt(p) && p != 1) {
        	fact[++n] = p;
			put[n] = q;
			p = 1;
		}
	}
}

void cit() {
	freopen("gfact.in", "r", stdin);
	freopen("gfact.out", "w", stdout);

	scanf("%d %d", &p, &q);
	
	get_fact();
}

void solve() {
	st = 0, dr = 1LL * 700000000 * 100000;
	while (st + 1 < dr) {
		ok = 1;
    	mid = 1LL * (st + dr) / 2;

		for (int i = 1; i <= n; i++) {
        	nr = 0;
 		    f = 1;

			while (f <= mid / fact[i]) {
				f *= fact[i];
            	nr += mid / f;
			}
			
			if (nr < put[i]) ok = 0;
		}

		if (ok) {
			if (sol == 0 || sol > mid) sol = mid;
			dr = mid;
		}
		else st = mid;
	}

	printf("%lld\n", sol);
}

int main() {

	cit();
	solve();

	return 0;
}