Pagini recente » Cod sursa (job #1093934) | Cod sursa (job #2843399) | Cod sursa (job #1808726) | Cod sursa (job #1736405) | Cod sursa (job #3153414)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");
long long formulaluiLegrendre(int B, int P){
long long putere = P, cnt =0;
while(putere <= B){
cnt+= B/putere;
putere*=P;
}
return cnt;
}
int main(){
int P, Q;
f>>P>>Q;
long long ans=0;
// int d=2;
long long putere = 0;
while(P % 2 == 0){
putere++;
P /= 2;
}
if(putere > 0){
long long left=1, right = Q * putere;
long long sol = 0 ;
while(left<= right){
long long mid = (left+right)/2;
if(formulaluiLegrendre(mid*2, 2) >= Q * putere){
sol = mid;
right = mid - 1;
}
else {
left = mid + 1;
}
}
ans = max(sol * 2, ans);
} int fin = P;
for(int i = 3; i * i <= fin; i += 2){
putere = 0;
while(P % i == 0){
P /= i;
putere ++ ;
}
if(putere > 0){
long long left=1, right = Q * putere;
long long sol = 0 ;
while(left<= right){
long long mid = (left+right)/2;
if(formulaluiLegrendre(mid*i, i) >= Q * putere){
sol = mid;
right = mid - 1;
}
else {
left = mid + 1;
}
}
ans = max(sol * i, ans);
}
}
if(P > 1){
long long left=1, right = Q;
long long sol = 0 ;
while(left<= right){
long long mid = (left+right)/2;
if(formulaluiLegrendre(mid*P, P) >= Q){
sol = mid;
right = mid - 1;
}
else {
left = mid + 1;
}
}
ans = (sol * P, ans);
}
g << ans;
}