Cod sursa(job #2813133)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 5 decembrie 2021 20:06:51
Problema GFact Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,p,factmin;
vector<int>f;
vector<int>e;

int number(int k,int x)
{
    int sol = 0;
    for (int i = x; i <= k; i *= x)
        sol += k / i;
    return sol;
}

int fm(int x,int y)
{
    int k = 1e9,pas = 1 << 29;
    while (pas != 0)
    {
        if (k - pas > 0)
            if (number(k - pas,x) >= y)
                k -= pas;
        pas /= 2;
    }
    return k;
}

int main()
{
    in >> n >> p;
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
        {
            f.push_back(i);
            int exp = 0;
            while (n % i == 0)
            {
                exp++;
                n /= i;
            }
            e.push_back(exp * p);
        }
    }
    if (n != 1)
    {
        f.push_back(n);
        e.push_back(p);
    }
    for (int i = 0; i < f.size(); i++)
        factmin = max(factmin,fm(f[i],e[i]));
    out << factmin;
    return 0;
}
/**
fm(x,y) = Kmin cu proprietatea x^y divide K,unde x prim si y < 1e6
caut binar Kmin pentru care number(K,x) >= y
number(K,x) = sol,unde sol este suma dintre
{
nr de numere din sirul x,2x,...,(K/x)x
nr de numere din sirul x^2,2x^2,...,(K/x^2)x^2
.
.
.
nr de numere din sirul x^y,2x^y,...,(K/x^y)x^y,cu prop ca x^(y + 1) > K
}

sol = K/x + k/x ^ 2 + ... + K / x^y si se calculeaza in timp logaritmic
**/