Pagini recente » Cod sursa (job #970004) | Cod sursa (job #856539) | Cod sursa (job #1267623) | Cod sursa (job #1244214) | Cod sursa (job #942118)
Cod sursa(job #942118)
#include<cstdio>
#include<vector>
#include<cmath>
FILE *f=fopen("gfact.in","r");
FILE *g=fopen("gfact.out","w");
using namespace std;
struct prim
{
int numb;
int cnt;
}expower[205];
int nr_div;
long long p,q,Answer;
void decom ( int number )
{
for(int i(2) ; i <= sqrt( number ) ; ++i )
{
int count(0);
if(!number%i)
{
++nr_div;
while( ! number%i )
{
number/=i;
++count;
}
expower[nr_div].numb=i;
expower[nr_div].cnt=count;
}
}
if( number != 1)
{
expower[++nr_div].cnt=1;
expower[nr_div].numb=number;
}
}
bool check ( long long number )
{
bool ok=true;
for(int i(1) ; i <= nr_div && ok; ++i )
{
int aux=number;
int count(0);
while( aux >= expower[i].numb )
{
count+=aux/expower[i].numb;
aux/=expower[i].numb;
if( count >= expower[i].numb )
break;
}
if( count < expower[i].cnt)
ok = false;
}
return ok;
}
void Solve ( void )
{
for(int i(1) ; i <= nr_div ; ++i )
expower[i].cnt*=q;
long long left(1),right;
right=1LL<<60;
while ( left <= right )
{
long long mid=(left+right)>>1;
if( check (mid) )
{
Answer=mid;
right=mid-1;
}
else
left=mid+1;
}
}
void Write ( void )
{
fprintf(g,"%lld",Answer);
fclose(g);
}
int main ( void )
{
fscanf(f,"%d%d",&p,&q);
fclose(f);
decom(p);
Solve();
Write();
return 0;
}