Pagini recente » Cod sursa (job #2149327) | Cod sursa (job #406563) | Cod sursa (job #1191609) | Cod sursa (job #2075634) | Cod sursa (job #2282729)
#include <iostream>
#include <fstream>
using namespace std;
const int ND = 10;
const int L = 45;
int p, q, d[ND], e[ND], nd;
ifstream in;
ofstream out;
void descompunere(int n)
{
int dv = 2;
while (dv * dv <= n)
{
if (n % dv == 0)
{
d[nd] = dv;
while (n % dv == 0)
{
e[nd]++;
n /= dv;
}
nd++;
}
dv++;
}
if (n > 1)
{
d[nd] = n;
e[nd++] = 1;
}
}
long long putere(long long n, int p)
{
///returneaza puterea la care pot sa-l ridic pe p a.i.
///sa-l divida pe n!
long long r = 0;
while (n >= p)
{
r += n / p;
n /= p;
}
return r;
}
bool divfact(long long n)
{
///verific daca n! e divizibil cu p^q folosind d si e
for (int i = 0; i < nd; i++)
{
if (putere(n, d[i]) < e[i] * q)
{
return false;
}
}
return true;
}
long long cautb()
{
long long r = 0, pas = 1LL << L;
while (pas != 0)
{
if (!divfact(r + pas))
{
r += pas;
}
pas /= 2;
}
r++;
return r;
}
int main()
{
in.open("gfact.in");
in >> p >> q;
in.close();
descompunere(p);
out.open("gfact.out");
out << cautb();
out.close();
return 0;
}