Cod sursa(job #1920074)

Utilizator herbertoHerbert Mohanu herberto Data 9 martie 2017 22:21:34
Problema GFact Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
using namespace std;
#define INF 2000000000
#define MAXN 44722
int legendre(int n, int d){
  int p, s;
  p=d; s=0;
  while(n/p>=1){
    s=s+n/p;
    p*=d;
  }
  return s;
}
int ciur[MAXN], prime[MAXN];
int main(){
  FILE*fin=fopen("gfact.in", "r");
  FILE*fout=fopen("gfact.out", "w");
  int n, p, q, st, dr, d, nr, min, exp, sol, cop, i, j;
  fscanf(fin, "%d%d", &p, &q);
  ciur[1]=ciur[0]=1;
  for(i=2; i*i<=MAXN; i++)
    if(ciur[i]==0)
      for(j=i*i; j<=MAXN; j+=i)
        ciur[j]=1;

  j=0;
  for(i=1; i<=MAXN; i++)
    if(ciur[i]==0){
      j++;
      prime[j]=i;
    }
  printf("%d\n", prime[1]);

  st=1; dr=INF;
  sol=-INF;
  while(st<=dr){
    n=(st+dr)/2;
    d=1;
    min=INF;
    cop=p;
//    printf("DA");
    while(prime[d]*prime[d]<=p){
      exp=0;
      while(p%prime[d]==0){
        p/=prime[d];
        exp++;
      }
      if(exp>0){
        nr=legendre(n, prime[d]);
        if(nr/exp<min)
          min=nr/exp;
      }
      d++;
    }
    if(p>1){
      nr=legendre(n, p);
      if(nr<min)
        min=nr;
    }
    if((min/q)>=1){
      dr=n-1;
      sol=n;
    }
    else
      st=n+1;
    p=cop;
  }
  fprintf(fout, "%d", sol);
  return 0;
}