Cod sursa(job #3153113)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 28 septembrie 2023 10:34:27
Problema GFact Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <iostream>
#include <cmath>
#include <fstream>

using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");




int legendre(int a, int p){
    int nr = 0, putere = p;
    while(putere <= a){
        nr += a / putere;
        putere *= p;
    }
    return nr;
}

int factorial(int p, int q){
    //merg din p in p
    long long st = 1, dr = q, sol = 0;

    while(st <= dr){
        long long mid = (st + dr) / 2;  
        if(legendre(mid * p, p) >= q){
            dr = mid - 1;
            sol = mid;
        } 
        else{
            st = mid + 1;
        }
    }
    return sol * p;
}

int main(){
    int p, q, sol = 0;
    f >> p >> q;
    int putere = 0;
    while(p % 2 == 0){
        p /= 2;
        putere++;
    }
    if(putere > 0){
        sol = max(sol, factorial(2, q * putere));
    }
    for(int i = 3; i <= sqrt(p); i += 2){
        putere = 0;

        while(p % i == 0){
            p /= i;
            putere++;
        }
        if(putere > 0){
             sol = max(sol, factorial(i, putere * q));
        }
       
    }
    g << sol << '\n';
}