Pagini recente » Cod sursa (job #2374409) | Cod sursa (job #67104) | Cod sursa (job #1199229) | Cod sursa (job #1625427) | Cod sursa (job #371249)
Cod sursa(job #371249)
#include<stdio.h>
#define dim 100
//#define dim1 30001
using namespace std;
long long v[dim], w[dim], b[dim], i,val,nr,put;
long long numarare(long long val, long long nr) //si asta face bine :D
{
long long n = 0;
while (nr > 0)
{
n += nr / val;
nr /= val;
}
return n;
}
long long cb(long long in, long long sf, long long num) // in mare sper ca e corect, pare sa faca bine
{
long long mij, r, sol;
while (in <= sf)
{
mij = (in + sf) / 2;
r = numarare(v[num], mij);
if (r >= w[num])
sol = mij, sf = mij-1;
else
in = mij+1;
}
return sol;
}
int main()
{ long long p,q,p1,t,k,r,i,max;
freopen("gfact.in", "r", stdin);
freopen("gfact.out", "w", stdout);
scanf("%lld %lld", &p, &q);
if(p == 1)
{
printf("1\n");
return 0;
}
else if(p == 0)
{
printf("0\n");
return 0;
}
p1 = p; t = 0; //verificat, merge bine --
for(k = 2; k*k <= p1; k++)
{ r = 0;
while(p % k == 0) r++, p /= k;
if(r != 0) v[++t] = k, w[t] = r*q;
} // --
if( p != 1 ) v[++t] = p, w[t] = q;
for( i = 1; i <= t; i++ ) //ar merge
b[i] = cb(1, ((long long)1<<60), i);
max = 0; // face cum trebuie, logic...
for( i = 1; i <= t; i++ )
{
if(b[i] > max) max = b[i];
}
printf("%lld\n", max);
return 0;
}