Cod sursa(job #1942577)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 28 martie 2017 07:53:51
Problema GFact Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define VAL 44725
#define DIV 35
#define INF 15000000000
#define LL long long

using namespace std;

ifstream fin("gfact.in");
ofstream fout("gfact.out");

int N, M, i, j, nr, L, K;
LL d[DIV], e[DIV];
LL prim[VAL], ans;
bool ok[VAL];

void Sieve()
{
    for (i=2; i<VAL; i++)
    {
        if (ok[i]==false)
        {
            prim[++K]=i;
            for (j=i*i; j<VAL; j+=i)
              ok[j]=true;
        }
    }
}

bool Verify(LL X, LL D, LL E)
{
    LL sum=0;
    while (X>0)
    {
        X/=D;
        sum+=X;
    }
    return sum>=E;
}

LL Binary_Search(LL D, LL E)
{
    LL be=1, en=INF;
    LL mid, ans=0;
    while (be<=en)
    {
        mid=(be+en) / 2;
        if (Verify(mid, D, E)==true)
        {
            ans=mid;
            en=mid-1;
        }
        else
          be=mid+1;
    }
    return ans;
}

int main()
{
    fin >> N >> M;
    Sieve();
    for (i=1; i<=K; i++)
    {
        if (N % prim[i]==0)
        {
            d[++nr]=prim[i];
            while (N % prim[i]==0)
            {
                N/=prim[i];
                e[nr]++;
            }
        }
        if (N==1)
          break;
    }
    if (N>1)
    {
        d[++nr]=N;
        e[nr]=1;
    }
    for (i=1; i<=nr; i++)
    {
        e[i]*=M;
        ans=max(ans, Binary_Search(d[i], e[i]));
    }
    fout << ans << '\n';
    fin.close();
    fout.close();
    return 0;
}