Pagini recente » Cod sursa (job #2534545) | Cod sursa (job #1921058) | Cod sursa (job #2903888) | Cod sursa (job #2099294) | Cod sursa (job #526625)
Cod sursa(job #526625)
#include<fstream>
using namespace std;
struct putere{
int val;
long long nr;};
putere v[50];
int q,p,num;
long long sol=12390232914312356ll;
void cautare(int st,long long dr);
void descompune();
long long numarare(int fact,long long panaN);
bool verifica(int val);
int main()
{
ifstream fin("gfact.in");
ofstream fout("gfact.out");
fin>>p>>q;
descompune();
cautare(1,10000000000ll);
fout<<sol;
return 0;
}
void descompune()
{
int rid=0,copie=p;
if(p%2==0)
{
while(p%2==0)
p=p/2,rid++;
v[++num].val=2;
v[num].nr=q*rid;
}
int i;
for(i=3;i*i<=copie && p>1;i++)
{
rid=0;
if(p%3==0)
{
while(p%i==0)
p=p/i,rid++;
v[++num].val=i;
v[num].nr=q*rid;
}
}
if(p>1)
v[++num].val=p,v[num].nr=q;
}
void cautare(int st,long long dr)
{
if(st==dr)
{
if(verifica(st)==1 && st<sol)
sol=st;
return ;
}
else
{
long long mij=(st+dr)/2;
if(verifica(mij)==1)
{
if(mij<sol)
sol=mij;
cautare(st,mij);
}
else
cautare(mij+1,dr);
}
}
bool verifica(int val)
{
int i;
for(i=1;i<=num;i++)
if(numarare(v[i].val,val)<v[i].nr)
return 0;
return 1;
}
long long numarare(int fact,long long panaN)
{
long long rez=panaN/fact;
long long copie=rez;
while(copie>0)
{
rez+=copie/fact;
copie/=fact;
}
return rez;
}