Pagini recente » Cod sursa (job #371443) | Cod sursa (job #1438168) | Cod sursa (job #1107330) | Cod sursa (job #2289659) | Cod sursa (job #2449894)
#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;
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;
}
}
primer = primer + 2;
}
}
int solve(int exp)
{
int maxValue = 0, taker, i;
int size = fact.size();
for(i = 0 ; i < size; i++)
{
taker = binarySearch(fact[i],num[i]);
if(taker > maxValue)
maxValue = i;
}
num[i] *= exp;
return binarySearch(fact[i],num[i]);
}
int main()
{
int p,q;
fin >> p >> q;
if(p == 1)
{
fout << 1 << "\n";
return 0;
}
primeDecomposition(p, q);
fout << solve(q) << "\n";
return 0;
}