Pagini recente » Cod sursa (job #2528636) | Cod sursa (job #179155) | Cod sursa (job #1785406) | Cod sursa (job #219936) | Cod sursa (job #1275122)
#include <stdio.h>
using namespace std;
FILE *f,*g;
int div[20], pow[20], nd, p, q;
void desc()
{
int i = 2;
while (i*i <= p)
{
if (p%i == 0)
{
nd++;
div[nd] = i;
while (p%i == 0)
{
pow[nd]++;
p /= i;
}
}
i++;
}
if (p != 1)
{
nd++;
div[nd] = p;
pow[nd] = 1;
}
}
long long putere(long long x, int k)
{
//calculeaza puterea maxima la care pot sa-l ridic pe k a.i. sa-l divida pe x!
long long rez = 0;
while(x >= k)
{
rez += x / k;
x /= k;
}
return rez;
}
//1*2*3*4*5*6*7*8*9*10*11 -> 11/2 + 5/2 + 2/2 = 5 + 2 + 1 = 8
bool divide(long long x)//verifica daca p^q il divide pe x!
{
for (int i = 1; i <= nd; i++)
if (putere(x, div[i]) < pow[i]*q)
return false;
return true;
}
long long cb()
{
long long pas = 1LL << 50;
long long i=0;
while(pas>0){
if(!divide(i + pas))
i+=pas;
pas=pas >> 1;
}
return 1 + i;
}
int main()
{
f=fopen("gfact.in","r");
g=fopen("gfact.out","w");
fscanf(f,"%d%d",&p,&q);
desc();
fprintf(g,"%lld",cb());
fclose(f);
fclose(g);
return 0;
}