Cod sursa(job #2635417)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 14 iulie 2020 13:49:08
Problema GFact Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include<bits/stdc++.h>
using namespace std;

#define NMAX 100005

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

long long n,m;

vector<pair<long long,long long>> factorizare;

void factor(long long x)
{
    int d = 2;
    while(x > 1)
    {

        if(x % d == 0)
        {
            int f = 0;
            while(x % d == 0)
            {
                x/=d;
                f++;
            }
            factorizare.push_back({d,f});

        }
        d++;
        if(d * d > x)
        {
            d = x;
        }
    }
}

long long count(long long nr,long long x)
{
    long long sol = 0;
    long long aux = nr;
    while(x / nr)
    {
        sol+=x/nr;
        nr*=aux;
    }
    return sol;
}

int nr(long long x)
{
    int ok = 1;

    for(int i = 0;i<factorizare.size() && ok;i++)
    {
        long long rez = count(factorizare[i].first,x);
        if(rez < factorizare[i].second )
            ok = 0;
    }

    return ok;
}

int main()
{
    fin>>n>>m;

    long long st = 0;
    long long dr = 5000000000;
    long long sol = -1;

    factor(n);

    for(int i = 0; i < factorizare.size();i++)
    {
        factorizare[i].second *= m;
    }

    while(st <= dr)
    {
        int m = (st + dr) / 2;

        int rez = nr(m);
        if(rez == 1)
        {
            sol = m;
            dr = m - 1;
        }
        else
        {
            st = m + 1;
        }


    }
    if(sol == 1)
        sol = 0;
    fout<<sol;


    return 0;
}