Cod sursa(job #935446)

Utilizator rudarelLup Ionut rudarel Data 3 aprilie 2013 14:53:56
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; }