Cod sursa(job #1593202)

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

int k, put;
long long  P, Q, MAX;
const long long INF (1 << 63);

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

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

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

        desc(P);

        printf("%lld", MAX);
    }

void desc(int A)
{
    if (A % 2 == 0)
    {
        put = 0;
        while (A % 2 == 0)
        {
            put++;
            A /= 2;
        }

        MAX = max(MAX, bs(2, put * Q));
    }

    for (int i = 3; 1LL * i * i <= A; i += 2)
        if (A % i == 0)
        {
            put = 0;
            while (A % i == 0)
            {
                put ++;
                A /= i;
            }

            MAX = max(MAX, bs(i, put * Q));
        }

    if (A > 1)
        MAX = max(MAX, bs(A, Q));
}

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;
}