Cod sursa(job #349180)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 18 septembrie 2009 13:52:25
Problema GFact Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<fstream>
using namespace std;

long long p,q,a,b;
long long cautare(long long l,long long r,long long div,long long putere);
int main()
{freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);

scanf("%ld %ld",&p,&q);



char prim[2000005];; int nr=0;
     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;}
}     
 long long aux=p; 
long long div[5003],puteri[5003]; long long nrdiv=0;    
 if (aux==2) {div[1]=2;nrdiv=1;puteri[1]=1;}
 else if(aux==3)  {div[1]=3;nrdiv=1;puteri[1]=1;}
 else
  for(int k=2;k*k<=aux;k++)
 {
          if(prim[k]==1 && aux%k==0)
  {nrdiv++;div[nrdiv]=k;int contor;puteri[nrdiv]=1;aux/=k;
   while(aux%k==0) {puteri[nrdiv]++;aux/=k;}
   
                
                
                }
  
        
        }  
        
 if(aux!=1) {nrdiv++;div[nrdiv]=aux;puteri[nrdiv]=1;} 
    
long long 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],div[i],puteri[i]*q);
        //printf("%ld \n",cand_aux);
    long long val=cand_aux*div[i];
   if(val>candidat) candidat=val;     
        
        }
    printf("%ld",candidat);  
    return 0;}
    
long long cautare(long long l,long long r,long long div,long long 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);      
         
         }
                
                
                }