Pagini recente » Cod sursa (job #2634569) | Cod sursa (job #489477) | Cod sursa (job #1074617) | Cod sursa (job #1553262) | Cod sursa (job #2813133)
#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
**/