Pagini recente » Cod sursa (job #1505791) | Cod sursa (job #2758066) | Cod sursa (job #2893574) | Monitorul de evaluare | Cod sursa (job #526640)
Cod sursa(job #526640)
#include<fstream>
using namespace std;
struct putere{
long long val;
long long nr;};
putere v[50];
int q,p,num;
long long sol=1239023291431235668ll;
void cautare(long long st,long long dr);
void descompune();
long long numarare(long long fact,long long panaN);
bool verifica(long long val);
int main()
{
ifstream fin("gfact.in");
ofstream fout("gfact.out");
fin>>p>>q;
descompune();
//fout<<numarare(2,2000000000000ll)<<endl;
cautare(1,20000000000000ll);
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+=2)
{
rid=0;
if(p%i==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(long long 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(long long 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(long long fact,long long panaN)
{
long long rez=panaN/fact;
long long copie=rez;
while(copie>0)
{
rez+=copie/fact;
copie/=fact;
}
return rez;
}