Pagini recente » Cod sursa (job #130263) | Cod sursa (job #112302) | Cod sursa (job #851276) | Cod sursa (job #1152246) | Cod sursa (job #2449891)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
vector <int> fact;
int num[1000];
int legendre(int check, int prime, int checker)
{
int number = 0;
int copy = prime;
while(prime <= check && number <= checker)
{
number = number + (check / prime);
check /= prime;
}
return number;
}
int binarySearch(int prime, int need)
{
int right = 1, left = 2000000000, result, solution = -1;
long long half;
while(right <= left)
{
half = (right + left) / 2;
result = legendre(half,prime, need);
if(result == need)
{
solution = half;
left = half - 1;
}
else
{
if(result < need)
right = half + 1;
else
left = half - 1;
}
}
return solution;
}
void primeDecomposition(int value, int exp)
{
int primer = 3;
if(value % 2 == 0)
{
fact.push_back(2);
int size = fact.size();
while(value % 2 == 0)
{
num[size - 1]++;
value = value / 2;
}
num[size - 1] *= exp;
}
while(value != 1)
{
if(value % primer == 0)
{
fact.push_back(primer);
int size = fact.size();
while(value % primer == 0)
{
num[size - 1]++;
value = value / primer;
}
num[size - 1] *= exp;
}
primer = primer + 2;
}
}
int solve()
{
int maxValue = 0, taker;
for(int i = 0 ; i < fact.size(); i++)
{
taker = binarySearch(fact[i],num[i]);
if(taker > maxValue)
maxValue = taker;
}
return taker;
}
int main()
{
int p,q;
fin >> p >> q;
if(p == 1)
{
cout << 1 << "\n";
return 0;
}
primeDecomposition(p, q);
fout << solve() << "\n";
return 0;
}