Cod sursa(job #3185509)

Utilizator cosmin983Pascale Cosmin cosmin983 Data 19 decembrie 2023 11:20:34
Problema GFact Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>


using namespace std;


#define int long long


ifstream cin("gfact.in");
ofstream cout("gfact.out");


vector <pair <int, int>> a;
int p, q, answer;


int valoarePutere(int baza, int valoareFactorial) {
	int putere = baza, exponent = 0;
	while (putere <= valoareFactorial) {
		exponent += valoareFactorial / putere;
		putere *= baza;
	}


	return exponent;
}


bool check(int valoare) {
	for (auto iterator : a) {
		if (valoarePutere(iterator.first, valoare) < iterator.second) {
			return false;
		}
	}
	return true;
}


void read() {
	cin >> p >> q;
}


void descompunere() {
	if (p % 2 == 0) {
		int putere = 0;
		while (p % 2 == 0) {
			p /= 2;
			++putere;
		}
		a.push_back({ 2, q * putere });
	}


	for (int divizor = 3; divizor * divizor <= p; divizor += 2) {
		if (p % divizor != 0) {
			continue;
		}


		int putere = 0;
		while (p % divizor == 0) {
			p /= divizor;
			++putere;
		}
		a.push_back({ divizor, q * putere });
	}


	if (p != 1) {
		a.push_back({ p, q });
	}
}


void solve() {
	int stanga = 0, dreapta = 2e9, mijloc;
	while (stanga <= dreapta) {
		mijloc = (stanga + dreapta) / 2;
		if (check(mijloc)) {
			answer = mijloc;
			dreapta = mijloc - 1;
			continue;
		}
		stanga = mijloc + 1;
	}
}


void display() {
	cout << answer;
}


signed main() {
	read();
	descompunere();
	solve();
	display();
	return 0;
}