Cod sursa(job #3153410)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 29 septembrie 2023 15:52:09
Problema GFact Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <algorithm>
#include <fstream>
using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");

int formulaluiLegrendre(int B, int P){
    int putere = P, cnt =0;
      while(putere <= B){
        cnt+= B/putere;
        putere*=P;
      }
      return cnt;
}

int cautarebinara(int p, int q){
    long long left=1, right = q;
    long long sol = 0 ;

    while(left<= right){
      long long mid = (left+right)/2;
      if(formulaluiLegrendre(mid*p, p) >= q){
          sol = mid;
          right = mid - 1;
      }
      else {
        left = mid + 1;
      }
    }
    return sol*p;
}
int main(){
    int  P, Q;
    f>>P>>Q;
    int sol=0;
  //  int d=2;
    int putere = 0;
    while(P % 2 == 0){
        putere++;
        P /= 2;
    }
    if(putere > 0){
        sol = max(sol, cautarebinara(2, Q * putere));
    }
        for(int i = 3; i * i <= P; i ++){
            putere = 0;
            while(P % i == 0){
                P /= i;
                putere ++ ;
            }
            if(putere > 0){
                sol = max(sol, cautarebinara(i, Q * putere));
            }  
        }
    
    if(P > 1){
        sol = max(sol, cautarebinara(P, Q));
    }

    g << sol;
}