Cod sursa(job #2356498)

Utilizator alexradu04Radu Alexandru alexradu04 Data 26 februarie 2019 18:47:07
Problema GFact Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>

using namespace std;

ifstream cin("gfact.in");
ofstream cout("gfact.out");

#define MAX(a, b) ((a > b) ? (a) : (b))

bool p[50005];
int v[50005];

void ciur() {
    for(long long int i = 2; i <= 225; i++) {
        if(p[i] == 0) {
            for(int j = i<<2; j <= 50000; j += i)
                p[j] = 1;        
        }
    }
    p[0] = 1;
    p[1] = 1;
}

///Result for prime number
long long int gfact(long long int p, long long int m) {
    long long int st = 0;
    long long int dr = m;
    long long int mid, calc, power;
    
    while(st < dr) {
        mid = (st+dr)/2;
        calc = 0;
        power = 1;
        for(int i = 0; i < 10; i++) {
            calc += (int) (mid/power);
            power *= p;
        }
        
        //cout << mid << " " << calc << endl;
        
        if(calc < m)
            st = mid+1;
        else
            dr = mid;
    }
    
    //cout << p << " " << mid << " " << calc << endl;
    
    return p*st;
}

int main()
{
    long long int a, b;
    
    cin >> a >> b;
    
    ciur();
    
    //cout << p[19];
    
    for(int i = 0; i <= 50000; i++) {
        if(p[i] == 0) {
            while(a % i == 0) {
                a /= i;
                v[i]++;            
            }
        }    
    }
    //cout << endl;
    
    long long int maxim = 0;
    for(int i = 0; i <= 50000; i++) {
        if(v[i] > 0) {
            maxim = MAX(maxim, gfact(i, v[i]*b));        
        }    
    }
    
    if(a > 1) {
        maxim = MAX(maxim, gfact(a, b));    
    }
    
    cout << maxim << endl;
    
    //cout << gfact(2, 2);
}