Cod sursa(job #3253081)

Utilizator andrei257Andrei Enache andrei257 Data 1 noiembrie 2024 12:51:58
Problema GFact Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
// https://www.infoarena.ro/problema/gfact

#include <bits/stdc++.h>
using namespace std;

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

struct fact_fr
{
	int base;
	int exp = 0;
};

int p, q, b, nr;

void dominantPrime()
{
	int n = p, f = 2;
	vector<fact_fr> factors;
	while (n > 1)
	{
		if (n % f == 0)
		{
			fact_fr desc;
			desc.base = f;
			factors.push_back(desc);
		}
		while (n % f == 0)
			factors[factors.size() - 1].exp++, n /= f;
		f++;
	}
	int bigPrime = 0;
	for (int i = 0; i < factors.size(); i++)
	{
		int power = pow(factors[i].base, factors[i].exp);
		if (power > bigPrime)
		{
			b = factors[i].base;
			nr = factors[i].exp;
			bigPrime = power;
		}
	}
}

long long fact_b(const long long n)
{
	long long x = 0, i = b;
	while (true)
	{
		x += n / i;
		if (i * b > INT_MAX)
			break;
		i *= b;
	}
	return x;
}

long long findSolution(const long long st, const long long dr)
{
	if (p == 1)
		return 0;
	const long long mid = (st + dr) / 2, val = fact_b(mid);
	if (val == nr * q * 1LL)
		return mid;
	if (val > nr * q * 1LL)
		return findSolution(st, mid - 1);
	return findSolution(mid + 1, dr);
}

int main()
{
	fin >> p >> q;
	dominantPrime();
	long long sol = findSolution(1, LONG_LONG_MAX);
	if (sol)
		sol -= sol % b;
	fout << sol;
	return 0;
}