Cod sursa(job #396541)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 15 februarie 2010 15:42:22
Problema GFact Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
using namespace std;
int p,q,a,b;
long long cautare(int l,int r,int div,int putere);
char prim[2000005];; int nr=0;
int dv[100004],puteri[100004]; int nrdiv=0; 
int main()
{freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%d %d",&p,&q);
for(int i=2;i<=p;i++) prim[i]=1;
for(int i=2;i<=p;i++)
     {if(prim[i]) {nr++;for(int j=i+i;j<=p;j+=i) prim[j]=0;}
}     
 int aux=p; 
   
 if (aux==2) {dv[1]=2;nrdiv=1;puteri[1]=1;}
 else if(aux==3)  {dv[1]=3;nrdiv=1;puteri[1]=1;}
 else
  for(int k=2;k*k<=aux;k++)
 {
          if(prim[k]==1 && aux%k==0)
  {nrdiv++;dv[nrdiv]=k;int contor;puteri[nrdiv]=1;aux/=k;
   while(aux%k==0) {puteri[nrdiv]++;aux/=k;}}}  
 if(aux!=1) {nrdiv++;dv[nrdiv]=aux;puteri[nrdiv]=1;} 
    
int candidat=0; 
for(int i=1;i<=nrdiv;i++)
 { //printf("%ld %ld \n",div[i],puteri[i]);
        long long cand_aux=cautare(1,q*puteri[i],dv[i],puteri[i]*q);
        //printf("%ld \n",cand_aux);
    long long val=cand_aux*dv[i];
   if(val>candidat) candidat=val;     
        
        }
    printf("%d",candidat);  
    return 0;}
    
long long cautare(int l,int r,int div,int putere)
 {if(l<=r)
   {long long mij=(l+r)/2;
   long long aux2=div*mij;
   long long  sum=0;
   long long imp=div;
   sum=0;
   while((aux2/imp)!=0) {sum+=(aux2/imp);imp*=imp;}
   
    if(sum==putere) {return mij;}
    if(sum<putere) {return cautare(mij+1,r,div,putere);}
    else return cautare(l,mij-1,div,putere);      
         
         }}