Pagini recente » Cod sursa (job #582208) | Cod sursa (job #1240733) | Profil CarausuMadalina | Cod sursa (job #2080406) | Cod sursa (job #2701746)
#include <fstream>
#include <climits>
#include <cmath>
#define NMAX 45000
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
int ciur[NMAX + 15], pp[NMAX], k;
int main()
{
int p, q;
cin >> p >> q;
for (int i = 3; i * i <= NMAX; i += 2)
{
if (ciur[i] == 0)
{
for (int j = i * i; j <= NMAX; j += i)
{
ciur[j] = 1;
}
}
}
pp[k++] = 2;
for (int i = 3; i <= NMAX; i += 2)
{
if (!ciur[i])
{
pp[k++] = i;
}
}
int p1 = p;
//for(int i=0;i<k;i++){cout<<pp[i]<<" ";}
long long int desc_p[NMAX] = {0}, exp_p[NMAX] = {0}, h1 = 0;
for (int i = 0; i < k && 1LL * pp[i] * pp[i] <= p; i++)
{
int c = 0;
while (p1 % pp[i] == 0 && p1 > 0)
{
c++;
p1 /= pp[i];
}
if (c > 0)
{
desc_p[h1] = pp[i], exp_p[h1] = c;
h1++;
}
}
if (p1 > 1)
{
desc_p[h1] = p1, exp_p[h1] = 1;
h1++;
}
//for(int i=0;i<h1;i++){cout<<desc_p[i]<<" "<<exp_p[i]<<" ";}
long long int st = 0, dr = LLONG_MAX, mid, mn;
mn = dr;
while (dr - st > 1) {
mid = st + (dr - st) / 2;
long long int mid1 = mid, s = 0, mnn = LLONG_MAX;
bool ok = true;
for (int i = 0; ok and i < h1; i++) {
while (mid1 > 0) {
mid1 /= desc_p[i];
s += mid1;
}
if (s >= exp_p[i] * q) {
ok = false;
}
// if (mnn > (s / exp_p[i]))
// {
// mnn = s / exp_p[i];
// }
//mnn=min(mnn,s/exp_p[i]);
}
if (ok) {
st = mid;
} else {
dr = mid;
}
}
cout << st + 1;
return 0;
}