Cod sursa(job #215589)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 19 octombrie 2008 15:40:10
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
# include <cstdio>
# include <math.h>

# define FIN "gfact.in"
# define FOUT "gfact.out"
# define MAXN 100

long long P,R,Q,i,j,N,max,sol;
long long D[MAXN];
long long O[MAXN];

     long long cauta(long long f,long long P,long long Q)
     {
        long long st,dr,mij,rez,cont,baza;
        
        st = f; dr = P*Q; rez = 0;
        while (st <= dr)
          {
             mij = (st + dr) >> 1;
             baza = P; cont = 0;
             for (; baza <= mij;)
               {
                  cont += mij/baza;
                  baza *= P;
               }
             if (cont >= Q)
               {
                  rez = mij;
                  dr = mij-1;
               }
             else
               st = mij+1;
          }
        return rez;
     }

     int main()
     {
         freopen(FIN,"r",stdin);
         freopen(FOUT,"w",stdout);
         
         scanf("%lld%lld",&P,&Q);
         N = 0;
         
         R = (long long) sqrt(P);
         for (i = 2; i <= R; ++i)
           if (!(P%i))
             {
                D[++N] = i;
                for (; !(P%i);)
                  {
                     O[N]++;
                     P /= i;
                  }
                O[N] = O[N]*Q;
             }
         if (P > 1)
           {
             ++N;  
             D[N] = P;  
             O[N] = Q;
           }
           
         for (i = 1; i <= N; ++i)
           {
              sol = cauta(1,D[i],O[i]);
              if (sol > max) max = sol;
           }
           
         printf("%lld",sol);
         
         
         
         
         
         
         
         
         
         
         
         
         return 0;
     }