Cod sursa(job #1909717)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 7 martie 2017 13:43:46
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<cstdio>
int p[100000],ex[100000];
void descompunere(int n)
{
  int d,i,e;
  d=2;
  i=0;
  while(d*d<=n&&n>1)
  {
    e=0;
    while(n%d==0)
    {
      n/=d;
      e++;
    }
    if(e){
    p[++i]=d;
    ex[i]=e;
    }
d++;
  }
  if(n>1){
    p[++i]=n;
    ex[i]=1;
    }
}
long long legendre(int k,long long n)
{
long long numitor=k,s=0;
while(numitor<=n)
{
  s=s+n/numitor;
  numitor=numitor*k;
}
return s;
}
long long bs(int poz)
{
long long st,dr,med,last,ans;
int k=p[poz];
st=1;dr=1LL<<62;
while(st<=dr)
{
med=dr-(dr-st)/2;
ans=legendre(k,med);
if(ans>=ex[poz])
{
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main(){
  int p,q,i;
  long long nr,max;
  freopen("gfact.in","r",stdin);
  freopen("gfact.out","w",stdout);
  scanf("%d%d",&p,&q);
  descompunere(p);
  i=1;
  while(ex[i]!=0)
  {
    ex[i]*=q;
    i++;
  }
  i=1;
  max=-1;
  while(ex[i]!=0)
  {
    nr=bs(i);
    if(nr>max)
    max=nr;
    i++;
  }
  printf("%lld",max);
return 0;
}