Cod sursa(job #3321652)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 10 noiembrie 2025 19:04:56
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
//https://www.nerdarena.ro/problema/gfact

//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES

#include <iostream>
#include <fstream>
//#include <vector>
//#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <stack>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <unordered_map>
//#include <set>
//#include <unordered_set>
//#include <cstdint>
//#include <climits>
//#include <iomanip>
//#include <cstdio>
//#include <tuple>

using namespace std;

ifstream fin("gfact.in");
ofstream fout("gfact.out");

const int64_t PMAX = 1e18;
const int NRMAX = 20;

int divi[NRMAX], put[NRMAX], poz;

bool verif(int64_t x)
{
	for (int i = 0; i < poz; ++i)
	{
		int64_t xc = x;
		int64_t cnt = 0;
		while (x)
		{
			cnt += x / divi[i];
			x /= divi[i];
		}

		if (cnt < put[i])
			return false;
		x = xc;
	}

	return true;
}

int main()
{
	//ios_base::sync_with_stdio(false);
	//cin.tie(nullptr);
	//cout.tie(nullptr);

	int p, q;

	fin >> p >> q;

	for (int64_t d = 2; d * d <= p; ++d)
	{
		if (p % d == 0)
		{
			while (p % d == 0)
			{
				p /= d;
				++put[poz];
			}
			divi[poz] = d;
			put[poz++] *= q;
		}
	}

	if (p != 1)
	{
		divi[poz] = p;
		put[poz++] = q;
	}

	int64_t st = 1, dr = PMAX, rez = 0;

	while (st <= dr)
	{
		int64_t mij = ((int64_t)st + dr) / 2;

		if (verif(mij))
		{
			dr = mij - 1;
			rez = mij;
		}
		else
			st = mij + 1;
	}

	fout << rez;

	return 0;
}