Cod sursa(job #349171)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 18 septembrie 2009 12:51:28
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream>
using namespace std;
char prim[5003];
long long p,q,a,b;
int cautare(int l,int r,int div,int putere)
 {if(l<r)
   {int mij=(l+r)/2;
   int aux2=div*mij;
   int sum=0;
   int imp=div;
   while((aux2/imp)!=0) {sum+=aux2/imp;imp*=imp;}
    if(sum==putere) return mij;
    if(sum<putere) return cautare(l,mij,div,putere);
    else return cautare(mij,r,div,putere);      
         
         }
                
                
                }
int main()
{ifstream in("gfact.in");
ofstream out("gfact.out");
in>>p>>q;
for(int i=1;i*i<=p;i++)
 prim[i]=1;
for(int i=2;i*i<=p;i++)
 for(int j=i+i;j*j<=p;j+=i)
  prim[i]=0;
 long long aux=p; 
 int div[5003],puteri[5003]; int 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=0;
   while(aux%k==0) {contor++;aux/=k;}
   puteri[nrdiv]=contor;
                
                
                }
  
        
        }  
          
long long candidat=0; 
for(int i=1;i<=nrdiv;i++)
 {int cand_aux=cautare(1,q*puteri[i],div[i],puteri[i]*q);
    int val=cand_aux*div[i];
   if(val>candidat) candidat=val;     
        
        }
         out<<candidat<<'\n';
    return 0;}