Cod sursa(job #66855)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 21 iunie 2007 16:20:55
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<math.h>
long long p,q,b,dim,fact[1000][2];

void init()
{long long i,lim,pow,k;
 k=2; lim=2*(long long)sqrt(p);
 while (p!=1)
  if (p%k==0) 
   { pow=0;
     while (p%k==0) { pow++; p/=k; }
     dim++; fact[dim][0]=k; fact[dim][1]=pow; }
  else if (k<=lim) (k==2)?(k=3):(k+=2); 
       else { fact[++dim][0]=p; fact[dim][1]=1; p/=p; }  
 for (i=1;i<=dim;i++) fact[i][1]*=q; }

long long max(long long a,long long b)
{if (a>b) return a;
 else return b; }

long long deter(long long x,long long a)
{long long nr=0;
 while (x!=0) nr+=(x/=a);  
 return nr; }

long long search(long long st,long long dr,long long a,long long b) //a-nr prim, b-puterea la care apare
{long long m,apar;
 if (st<dr)
  { m=(st+dr)/2; 
    apar=deter(m,a)+m;
    if (apar==b) return m; 
    else if (b<apar) return search(st,m-1,a,b);
         else return search(m+1,dr,a,b); }
 else return st;
 }

int main()
{long i;
 freopen("gfact.in","r",stdin);
 freopen("gfact.out","w",stdout);   
 scanf("%lld%lld",&p,&q);
 if (p==1) b=1;
 init();
 for (i=1;i<=dim;i++)
  b=max(b,search(1,fact[i][1],fact[i][0],fact[i][1])*fact[i][0]);
 printf("%lld\n",b);
 fclose(stdin); fclose(stdout);
 return 0; }