Nu aveti permisiuni pentru a descarca fisierul grader_test14.ok
Cod sursa(job #1464098)
Utilizator | Data | 22 iulie 2015 12:23:48 | |
---|---|---|---|
Problema | GFact | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.27 kb |
#include <fstream>
using namespace std;
long long powerInFact(long long number, long long div)
{
long long i = div;
long long result = 0;
while(i <= number)
{
result += number / i;
i *= div;
}
return result;
}
long long minFact(long long nr, long long power)
{
long long left = 1 , right = power, mid;
long long pow;
while(left < right)
{
mid = (left + right) / 2;
pow = powerInFact(mid * nr, nr);
if(pow < power)
left = mid + 1;
else
right = mid;
}
return right * nr;
}
long long maxFact(long long p, long long q)
{
long long power;
long long maxNr = 0;
long pp = p;
for(int i = 2; p > 1 && i * i <= pp ; i++)
{
if(p % i == 0)
{
power = 0;
while(p % i == 0)
{
power++;
p /= i;
}
maxNr = max(maxNr, minFact(i, power * q));
}
}
if(p > 1)
maxNr = minFact(p, q);
return maxNr;
}
int main()
{
int p, q;
ifstream f("gfact.in");
f >> p >> q;
f.close();
ofstream g("gfact.out");
g << maxFact(p, q) << '\n';
g.close();
return 0;
}