Cod sursa(job #307907)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 25 aprilie 2009 14:32:35
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<math.h>
#include<string>
#include<vector>
using namespace std;
FILE*fin=fopen("gfact.in","r");
FILE*fout=fopen("gfact.out","w");
#define max(a,b)((a)>(b)?(a):(b))
vector<int> numar,putere;
int p,q;
int ok(int F,int ni,int pi)
{
    int na=0,cp,nr;
    for(cp=1,nr=ni;cp<=pi*q;cp++,nr*=ni)
    {
      na+=F/nr;
      if(na>=pi*q) return 1;
    }
    return 0;
}
int main()
{
    int ans=0,sqp,div,pwc,i,ni,pi,st,dr,mij;
    fscanf(fin,"%d%d",&p,&q);
    sqp=(int)sqrt(p);
    for(div=2;div<=sqp,p>1;div++)
      if(p%div==0)
      {
        pwc=0;
        while(p%div==0&&p>1)
        {
          pwc++;
          p/=div;
        }
        numar.push_back(div);
        putere.push_back(pwc);
      }
    for(i=0;i<numar.size();i++)
    {
      ni=numar[i];
      pi=putere[i];
      st=1;dr=2000000000;
      while(st<dr)
      {
        mij=(st+dr)/2;
        if(ok(mij,ni,pi)) dr=mij;
        else st=mij+1;
      }
      ans=max(ans,st);
    }  
    fprintf(fout,"%d",ans);
    fclose(fin);
    fclose(fout);
    return 0;
}