Pagini recente » Cod sursa (job #890357) | Cod sursa (job #949293) | Cod sursa (job #296454) | Cod sursa (job #1734756) | Cod sursa (job #942099)
Cod sursa(job #942099)
#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;
prim()
{
numb=cnt=0;
}
}expower[205];
int nr_div;
int 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 ( int number )
{
bool ok=true;
for(int i(1) ; i <= nr_div ; ++i )
{
int aux=number;
int cnt=0;
int count(0);
while( aux >= expower[i].numb )
{
count+=aux/expower[i].numb;
aux/=expower[i].numb;
}
if( count < expower[i].cnt)
return false;
}
return true;
}
void Solve ( void )
{
for(int i(1) ; i <= nr_div ; ++i )
expower[i].cnt*=q;
int left(1),right(2000000000);
while ( left <= right )
{
int mid=(left+right)>>1;
if( check (mid) )
{
Answer=mid;
right=mid-1;
}
else
left=mid+1;
}
}
void Write ( void )
{
fprintf(g,"%d",Answer);
fclose(g);
}
int main ( void )
{
fscanf(f,"%d%d",&p,&q);
fclose(f);
decom(p);
Solve();
Write();
return 0;
}