Cod sursa(job #1336080)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 6 februarie 2015 16:34:41
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <climits>

#define VALmax 1000000 + 10
#define val first
#define tmp second
#define ll long long

using namespace std;

ll a , b;

vector < ll > sol;

vector < pair < ll , ll > > prim;

void makePM(ll x)
{
    ll crt = x;

    ll i = 2;

    if (crt % i == 0)
    {
        ll y = 0;
        while (crt % i == 0)
        {
            crt /= i;
            y++;
        }

        prim.push_back ( make_pair ( i , y * b ) );
    }

    for (i = 3; i * i <= x; i += 2)
    if (crt % i == 0)
    {
        ll y = 0;
        while (crt % i == 0)
        {
            crt /= i;
            y++;
        }

        prim.push_back ( make_pair ( i , y * b ) );
    }


    if (crt > 1)
    {
        prim.push_back ( make_pair ( crt , b ) );
    }
}

long long cb()
{
    ll st = 1; ll dr = LONG_MAX; ll lg = prim.size();

    for (ll mij = (st + dr) >> 1; st <= dr; mij = (st + dr) >> 1)
    {
        ll x = mij; ll y = 0;

        if (!sol.empty()) sol.clear();

        for (ll i = 0; i < lg; ++i)
        {
            y = 0; ll crt = prim[i].val;

            while (crt <= x)
            {
                y += x / crt;
                crt *= prim[i].val;
            }

            sol.push_back(y);
        }

        bool ok = true;

        for (ll i = 0; i < lg; ++i)
         if (sol[i] < prim[i].tmp) ok = false;

        if (ok) dr = mij - 1;
        else st = mij + 1;
    }

    return st;
}

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

    scanf("%lld %lld", &a, &b);

    makePM(a);

    printf("%lld\n", cb());

    return 0;
}