Pagini recente » Cod sursa (job #2457007) | Istoria paginii runda/winners27/clasament | Cod sursa (job #1126189) | Cod sursa (job #1784633) | Cod sursa (job #942350)
Cod sursa(job #942350)
#include<cstdio>
#include<vector>
#include<cmath>
#define ll long long
FILE *f=fopen("gfact.in","r");
FILE *g=fopen("gfact.out","w");
using namespace std;
struct prim
{
int numb;
int cnt;
}expower[20005];
ll nr_div;
ll p,q,Answer;
void decom ( int number )
{
for(int i(2) ; i <= sqrt( number ) && number!=1 ; ++i )
{
int count(0);
if( number%i == 0 ){
++nr_div;
while( number%i == 0 )
{
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 ( ll number )
{
bool ok=true;
for(int i(1) ; i <= nr_div && ok; ++i )
{
ll aux=number;
ll count(0);
while( aux >= expower[i].numb && aux >0 )
{
count+=(ll)aux/expower[i].numb;
aux/=(ll)expower[i].numb;
if( count >= expower[i].cnt )
break;
}
if( count < expower[i].cnt)
return false;
}
return true;
}
void Solve ( void )
{
for(int i(1) ; i <= nr_div ; ++i )
expower[i].cnt*=q;
ll left=1;
ll mid;
ll right=1LL<<60;
while ( left <= right )
{
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,"%lld%lld",&p,&q);
fclose(f);
decom(p);
Solve();
Write();
return 0;
}