Pagini recente » Cod sursa (job #2832670) | Cod sursa (job #107208) | Cod sursa (job #1780365) | Cod sursa (job #1949337) | Cod sursa (job #3153113)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");
int legendre(int a, int p){
int nr = 0, putere = p;
while(putere <= a){
nr += a / putere;
putere *= p;
}
return nr;
}
int factorial(int p, int q){
//merg din p in p
long long st = 1, dr = q, sol = 0;
while(st <= dr){
long long mid = (st + dr) / 2;
if(legendre(mid * p, p) >= q){
dr = mid - 1;
sol = mid;
}
else{
st = mid + 1;
}
}
return sol * p;
}
int main(){
int p, q, sol = 0;
f >> p >> q;
int putere = 0;
while(p % 2 == 0){
p /= 2;
putere++;
}
if(putere > 0){
sol = max(sol, factorial(2, q * putere));
}
for(int i = 3; i <= sqrt(p); i += 2){
putere = 0;
while(p % i == 0){
p /= i;
putere++;
}
if(putere > 0){
sol = max(sol, factorial(i, putere * q));
}
}
g << sol << '\n';
}