Cod sursa(job #1942573)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 28 martie 2017 07:33:41
Problema GFact Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define VAL 44725
#define DIV 25
#define INF 2000000000

using namespace std;

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

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

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

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

int Binary_Search(int D, int E)
{
    int be=1, en=INF;
    int mid, ans;
    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;
    }
    ans=INF;
    for (i=1; i<=nr; i++)
    {
        e[i]*=M;
        ans=min(ans, Binary_Search(d[i], e[i]));
    }
    fout << ans << '\n';
    fin.close();
    fout.close();
    return 0;
}