Cod sursa(job #942351)

Utilizator superman_01Avramescu Cristian superman_01 Data 21 aprilie 2013 22:39:29
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<cstdio>
#include<vector>
#include<cmath>

#define ll long long

FILE *f=fopen("gfact.in","r");
FILE *g=fopen("gfact.out","w");

using namespace std;

struct prim
{
 int numb;
 int cnt;
}expower[20005];
ll nr_div;
ll p,q,Answer;

void decom ( int number )
{

    for(int i(2) ; i <= sqrt( number ) && number!=1 ; ++i )
    {
        int count(0);
        if( ! (number%i) ){
            ++nr_div;
        while(  !(number%i)   )
        {
            number/=i;
            ++count;
        }
        expower[nr_div].numb=i;
        expower[nr_div].cnt=count;
        }
    }
    if( number != 1)
    {
        expower[++nr_div].cnt=1;
        expower[nr_div].numb=number;
    }
}


bool check ( ll number )
{

  bool ok=true;
  for(int i(1) ; i <= nr_div && ok; ++i )
  {
   ll aux=number;
   ll count(0);

       while( aux >= expower[i].numb && aux >0 )
    {
        count+=(ll)aux/expower[i].numb;
        aux/=(ll)expower[i].numb;
       if( count >= expower[i].cnt )
        break;
    }
    if( count < expower[i].cnt)
        return false;

    }
return true;

}

void Solve ( void )
{
   for(int i(1) ; i <= nr_div ; ++i )
    expower[i].cnt*=q;
    ll left=1;
    ll mid;
    ll right=1LL<<60;

      while ( left <= right )
      {
          mid=(left+right)>>1;
          if( check(mid) )
          {
              Answer=mid;
              right=mid-1;

          }

          else
            left=mid+1;
      }


}
void Write ( void )
{
    fprintf(g,"%lld",Answer);
    fclose(g);
}
int main ( void )
{
    fscanf(f,"%lld%lld",&p,&q);
    fclose(f);
    decom(p);
    Solve();
    Write();
    return 0;
}