Cod sursa(job #331631)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 14 iulie 2009 19:37:47
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#include<math.h>

long long i,j,n,p,q,b,a,max,k,r;

long long putere(long long x,long long a)
{ long long  rez=0;
    while(a) { a/=x;
               rez+=a;
             }
  return rez;           
}               

long long cautbin(long long lim,long long t)
{ 
    long long st=1,dr=lim,mij,k,k1;
    while(st<=dr) { mij=(st+dr)/2;
                    k=putere(t,mij*t);   
                    k1=putere(t,(mij-1)*t);
                    if((k1<lim&&k>=lim)||(k>=lim&&mij==1)) return mij*t;
                    else if(k1<lim&&k<lim) st=mij+1;
                    else dr=mij-1;
                  }
    return 0;
}                

int main()
{ 
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    
    scanf("%lld %lld",&p,&q);
    
    while(p%2==0) 
                  { p/=2;
                    r++;
                  }
   r=cautbin(r*q,2);
   if(r>max) max=r;
   k=int(sqrt(p));
   for(i=3;i<=k;i+=2) { r=0;
                        while(p%i==0) { p/=i;
                                        r++;
                                      }
                                     
                        if(r){  r=cautbin(r*q,i);
                             } 
                        if(r>max) max=r;
                      }        
   if(p>1)  { r=cautbin(q,p);
              if(r>max) max=r;
            }                            
   printf("%lld\n",max);
   fclose(stdin);
   fclose(stdout);
   return 0;
}