Cod sursa(job #1593189)

Utilizator mirupetPetcan Miruna mirupet Data 8 februarie 2016 13:21:27
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
#include<cmath>
#include<algorithm>
#define DIM 50
using namespace std;

int k;
long long  P, Q, MAX;
long long w[DIM], v[DIM];
const long long INF (1 << 63);

void desc(long long);
long long bs(int, int); //(long long, long long);

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

        scanf("%lld%lld", &P, &Q);

        desc(P);
        for (int i = 1; i <= k; i++)
        {
            w[i] *= Q;
            MAX = max(MAX, bs(v[i], w[i]));
        }

        printf("%lld", MAX);
    }

void desc(long long A)
{
    if (A % 2 == 0)
    {
        v[++k] = 2;
        while (A % 2 == 0)
        {
            w[k]++;
            A /= 2;
        }
    }

    for (int i = 3; i * i <= A; i++)
        if (A % i == 0)
        {
            v[++k] = i;
            while (A % i == 0)
            {
                w[k] ++;
                A /= i;
            }
        }

    if (A > 1)
        v[++k] = A, w[k] = 1;
}

long long bs(int A, int B)
{
    long long left = 0, right = 1LL * A * B;

    while (left <= right)
    {
        long long ans = (left + right) / 2;
        int sol = 0, C = A;
        while (C <= ans)
        {
            sol += ans / C;
            C *= A;
        }

        if (sol < B)
            left = ans + 1;
        else
            right = ans - 1;
    }

    return left;
}