Cod sursa(job #2449891)

Utilizator mirceatlxhaha haha mirceatlx Data 21 august 2019 00:44:19
Problema GFact Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

vector <int> fact;
int num[1000];

int legendre(int check, int prime, int checker)
{
    int number = 0;
    int copy = prime;
    while(prime <= check && number <= checker)
    {
        number = number + (check / prime);
        check /= prime;
    }

    return number;
}

int binarySearch(int prime, int need)
{
    int right = 1, left = 2000000000, result, solution = -1;
    long long half;
    while(right <= left)
    {
        half = (right + left) / 2;
        result = legendre(half,prime, need);
        if(result == need)
        {
             solution = half;
             left = half - 1;
        }
        else
        {
            if(result < need)
                right = half + 1;
            else
                left = half - 1;
        }
        
    }
    return solution;
}

void primeDecomposition(int value, int exp)
{
    int primer = 3;

    if(value % 2 == 0)
    {
        fact.push_back(2);
        int size = fact.size();
        while(value % 2 == 0)
        {
            num[size - 1]++;
            value = value / 2;
        }
        num[size - 1] *= exp;
    }

    while(value != 1)
    {
        if(value % primer == 0)
        {
            
            fact.push_back(primer);
            int size = fact.size();
            while(value % primer == 0)
            {
                num[size - 1]++;
                value = value / primer;  
            }
            num[size - 1] *= exp;
        }
        primer = primer + 2;
    }

}

int solve()
{
    int maxValue = 0, taker;
    for(int i = 0 ; i < fact.size(); i++)
    {
        taker = binarySearch(fact[i],num[i]); 
        if(taker > maxValue)
            maxValue = taker;
    }

    return taker;
}
int main()
{
    int p,q;
    fin >> p >> q;
    if(p == 1)
        {
            cout << 1 << "\n";
            return 0;
        }
    primeDecomposition(p, q);
    fout << solve() << "\n";
    return 0;
}