Cod sursa(job #169264)

Utilizator scvalexAlexandru Scvortov scvalex Data 1 aprilie 2008 15:03:04
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 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) {
	/*long long i, step;
	for (step = 1; step <= f; step <<= 1)
		;
	for (i = 1; step; step >>= 1) {
		cout << "Try " << (i + step) * t << endl;
		if ((i + step <= f) && (putere((i + step) * t, t) <= f))
			i += step;
		cout << "Got " << putere((i + step) * t, t) << " ? " << f << endl;
		cout << "So far " << i << endl;
	}
	
	return i*t;*/
	long long p = 1; 
	long long r = f; 
	while (p != r) { 
		//cout << p << " " << r << endl; 
		long long q = (p + r) / 2; 
		if (putere(q * t, t) < f) 
			p = q + 1; 
		else 
			r = q; 
	} 
	//cout << p*t << endl; 
	return p*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*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;
	}
	if (aux > 1) {
		long long vah = pp(aux, Q*Q);
		if (vah > m)
			m = vah;
	}

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

	return 0;
}