Cod sursa(job #2382398)

Utilizator Mihai.MocanuMihai mmm Mihai.Mocanu Data 18 martie 2019 11:55:45
Problema GFact Scor 75
Compilator c-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int dp[20],e[20],p,q,ndp;
long long np,pas,r;

void desc(int n){
  int d=2;
  while(d*d<=n){
    if(n%d==0){
      dp[ndp]=d;
      while(n%d==0){
        e[ndp]++;
        n/=d;
      }
      ndp++;
    }
    d++;
  }
  if(n>1){
    dp[np]=n;
    e[np]=1;
    ndp++;
  }
}

long long putere_fact(long long n, int d){
  long long nr=0;
  while(n>=d){
    nr+=n/d;
    n/=d;
  }
  return nr;
}

bool se_divide(long long n){
  for(int i=0;i<ndp;i++){
    if(putere_fact(n,dp[i])<e[i]*q){
      return false;
    }
  }
  return true;
}

int main(){
  FILE *fin,*fout;
  fin=fopen("gfact.in","r");
  fout=fopen("gfact.out","w");

  fscanf(fin,"%d%d",&p,&q);

  desc(p);
  pas=1ll<<35;
  r=-1;
  while(pas!=0){
    if(!se_divide(r+pas)){
      r+=pas;
    }
    pas/=2;
  }

  fprintf(fout,"%lld",r+1);

  fclose(fin);
  fclose(fout);
  return 0;
}