Pagini recente » Cod sursa (job #2080384) | Cod sursa (job #2056425) | Cod sursa (job #1599489) | Cod sursa (job #293921) | Cod sursa (job #353468)
Cod sursa(job #353468)
#include<cstdio>
int v[1000];
int c[1000];
int n2;
void descompunere(int p)
{
if (p%2==0) v[++v[0]]=2;
while (p%2==0) { c[v[0]]++; p/=2;}
for (int i=3;i*i<=p;i+=2)
{
if (p%i==0)
v[++v[0]]=i;
while (p%i==0)
{
c[v[0]]++;
p/=i;
}
}
if (p>1)
{
v[++v[0]]=p;
c[v[0]]=1;
}
c[0]=v[0];
}
bool nrz( int n, int a, int b)//verific daca a (prim) apare la o putere >=b in desc lui n!
{
int b2=0;
while(n)
b2 += (n/=a);
return b2>=b;
}
bool div( int n)
{
for (int i=1;i<=v[0];i++)
if (!nrz(n,v[i],c[i]) ) return 0;
return 1;
}
int caut()
{
int i,pas;
for (pas=1;pas<=n2;pas<<=1); // Puterea lui 2 <n
for (i=0;pas;pas>>=1)
if (!div(i+pas) ) i+=pas;
return i+1;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int p,q;
scanf("%d%d", &p , &q);
descompunere(p);
for (int i=1;i<=v[0];i++)
c[i]*=q;
n2=p;
int c2=caut();
printf("%d", c2);
return 0;
}