Cod sursa(job #3031077)

Utilizator ionicaion ionica Data 18 martie 2023 16:27:48
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;
int w[100],e[100],n;///numerele prime si exponentii din descompunerea lui p
int P, Q;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
void desc(int z)///desc in factori primi a lui z; z=w[1]^e[1]*...*w[n]^e[n]
{
    int d = 2;
    n=0;
    while (d * d <= z)
    {
        if (z % d == 0)
        {
            w[++n] = d;
            while(z % d == 0)
            {
                e[n]++;
                z = z/d;
            }
        }
        d++;
    }
    if (z != 1)///ultimul divizor prim
    {
        w[++n] = z;
        e[n] = 1;
    }
}

long long putere(long long u, int p)
{
    /// calculeaza x a.i. u=p^x, x maxim, p=numar prim, x=?
    long long x;
    x=0;
    while (u >= p)
        {
            x = x + u / p;
            u=u/p;
        }

    return x;
}

int verif(long long b)/// daca b! se divide cu w[i]^A, unde A=P^Q
{
    int i;
    long long ex;

    for (i = 1; i <= n; i++)
    {

        ex = putere(b, w[i]);
        if (ex < e[i] * Q)
            return 0;
    }

    return 1;
}

int main()
{
    long long st,dr,B,mij;
    fin>>P>>Q;;
    desc(P);
    st = 1;
    dr = 6e13+5;
    B = -1;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (verif(mij))
        {
            B = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    fout<<B;
    return 0;
}