Cod sursa(job #157706)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 13 martie 2008 11:02:52
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#define inf 1<<62

long x,y,p[15000],q,i,j,ok,nd,d[20],pd[20];
long long max,sol;

long long binary(long d,long p){
     long long low=1,high=(long long)inf,mid;
     long long v[65],nr;
     long i,j;
     v[0]=1;
     i=1;
     while (((long long)inf)/v[i-1]>=d){
           v[i]=v[i-1]*d;
           i++;
     }
     j=i-1;
     
     while (low<high){
           mid=(high+low)/2;
           nr=0;
           for (i=1;i<=j;i++)
               nr+=mid/v[i];
           if (nr>=p)
              high=mid;
           else {low=mid+1;}
     }
return low;
}

int main(){
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    
    scanf("%ld %ld",&x,&y);
    
    p[1]=2;
    p[2]=3;
    q=2;
    while (i<=50000){
          ok=1;
          j=1;
          while (p[j]*p[j]<=i){
                if (i%p[j]==0)
                   {ok=0;break;}
                j++;
          }
          if (ok)p[++q]=i;
          i+=2;
    }
    
    i=1;nd=0;
    while (p[i]*p[i]<=x){
          if (x%p[i]==0){
             pd[++nd]=0;
             d[nd]=p[i];
             while (x&p[i]==0){
                   x/=p[i];
                   pd[nd]++;
             }
          }
          i++;
    }
    if (x>1){nd++;d[nd]=x;pd[nd]=1;}
    for (i=1;i<=nd;i++){
        sol=binary(d[i],pd[i]*y);
        if (max<sol)max=sol;
    }
    printf("%lld\n",max);
 
return 0;   
}