Cod sursa(job #3153411)

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

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


int main(){
    int  P, Q;
    f>>P>>Q;
    long long ans=0;
  //  int d=2;
    long long putere = 0;
    while(P % 2 == 0){
        putere++;
        P /= 2;
    }
    if(putere > 0){
        long long left=1, right = Q * putere;
                long long sol = 0 ;

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

                  while(left<= right){
                     long long mid = (left+right)/2;
                      if(formulaluiLegrendre(mid*i, i) >= Q * putere){
                          sol = mid;
                            right = mid - 1;
                             }
                            else {
                                 left = mid + 1;
                             }
                      }
                  ans = max(sol * i, ans);
               }  
        }
    
    if(P > 1){
        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;
                             }
                      }
                  ans = (sol * P, ans);
    }

    g << ans;
}