Pagini recente » Cod sursa (job #2243043) | Cod sursa (job #114579) | Cod sursa (job #1749495) | Cod sursa (job #2471556) | Cod sursa (job #2085019)
#include <stdio.h>
#include <utility>
#include <vector>
typedef std::vector<std::pair<int, int>> A;
bool BfactDivA(int b, A &a);
int main()
{
FILE *fin = fopen("gfact.in", "r"),
*fout = fopen("gfact.out", "w");
int p, q;
int d;
A a;
fscanf(fin, "%d %d", &p, &q);
d = 2;
while(d * d <= p)
{
int x = 0;
while(p % d == 0)
{
p = p / d;
x++;
}
if(x >= 0)
a.emplace_back(d, x * q);
d++;
}
if(p != 1)
a.emplace_back(p, q);
/*for(std::pair<int, int> x: a)
{
printf("%d %d\n", x.first, x.second);
}*/
int step = 1 << 30;
int r = 0;
while (step != 0)
{
if(!BfactDivA(r + step, a))
r += step;
step /= 2;
}
fprintf(fout, "%d", r + 1);
fcloseall();
return 0;
}
bool BfactDivA(int b, A &a)
{
bool divides = true;
for(std::pair<int, int> x: a)
{
unsigned int p, n;
n = 0;
p = static_cast<unsigned int>(x.first);
while(p <= b)
{
n += b / p;
p *= x.first;
}
divides &= n >= x.second;
}
return divides;
}