Cod sursa(job #169240)

Utilizator scvalexAlexandru Scvortov scvalex Data 1 aprilie 2008 14:27:15
Problema GFact Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

int P, Q;

long long putere(long long x, long long t) {
	long long r(0);
	long long aux = t;
	while (aux <= x) {
		r += x / aux;
		aux *= t;
	}
	return r;
}

long long pp(long long t, long long f) {
	//cout << t << " " << f << endl;

	/*int p = 1;
	int r = f;
	while (p != r) {
		//cout << p << " " << r << endl;
		int q = (p + r) / 2;
		if (putere(q * t, t) < f)
			p = q + 1;
		else
			r = q;
	}

	//cout << p*t << endl;
	if (m < p*t)
		m = p*t;*/
	long long i, step;
	for (step = 1; step <= f; step <<= 1)
		;
	for (i = 1; step; step >>= 1) 
		if ((i + step <= f) && (putere((i + step) * t, t) <= f))
			i += step;
	
	//cout << i*t << endl;
	return i*t;
}

int main(int argc, char *argv[]) {
	ifstream fin("gfact.in");
	fin >> P >> Q;
	fin.close();

	int aux = P;
	int t(0);
	while (aux % 2 == 0) {
		++t;
		aux /= 2;
	}
	long long m = -1;
	if (t) {
		long long vah = pp(2, t*Q);
		if (vah > m)
			m = vah;
	}
	int i = 3;
	while (i <= aux) {
		t = 0;
		while (aux % i == 0) {
			++t;
			aux /= i;
		}
		if (t) {
			long long vah = pp(i, t*Q);
			if (vah > m)
				m = vah;
		}
		i += 2;
	}

	ofstream fout("gfact.out");
	fout << m << endl;
	fout.close();

	return 0;
}