Cod sursa(job #792683)

Utilizator vlad2901Vlad Berindei vlad2901 Data 29 septembrie 2012 02:29:09
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>

#define MAXF 100

using namespace std;

int p, q;
int fact[MAXF], power[MAXF], current;

void desc(int n)
{
    int d = 2;

    while(n > 1)
    {
        int p = 0;
        while(n > 1 && n%d == 0)
        {
            n /= d;
            ++p;
        }
        if(p > 0)
        {
            fact[current] = d;
            power[current++] = p;
        }
        ++d;
    }
}

long long pp(int fact, long long n) //puterea la care apare fact in n!
{
    long long rez = 0, t = fact;

    while(t <= n)
    {
        rez += n/t;
        t *= fact;
    }

    return rez;

}


long long bsearch(int poz) //cel mai mic numar b a.i. b! se imparte la fact^power*q
{
    long long left, right, m, sol;

    sol = 0;
    left = 0;
    right = power[poz] * q;

    while(left <= right)
    {
        m = (left + right) / 2;

        if(pp(fact[poz], m * fact[poz]) >= (long long)power[poz] * q)
        {
            sol = m;
            right = m-1;
        }
        else
        {
            left = m+1;
        }
    }

    return sol * fact[poz];


}

int main()
{

    freopen("gfact.in", "r", stdin);
    freopen("gfact.out", "w", stdout);

    scanf("%d %d", &p, &q);

    desc(p);

    long long sol = -1;

    for(int i=0;i<current;++i)
    {
        sol = max(bsearch(i), sol);
    }

    printf("%lld", sol);



    return 0;
}