Pagini recente » Cod sursa (job #2458799) | Cod sursa (job #791641) | Cod sursa (job #883360) | Cod sursa (job #2600428) | Cod sursa (job #526629)
Cod sursa(job #526629)
#include<fstream>
using namespace std;
struct putere{
int val;
int nr;};
putere v[50];
int q,p,num;
long long sol=12390232914312356ll;
void cautare(int st,int dr);
void descompune();
int numarare(int fact,int panaN);
bool verifica(int val);
int main()
{
ifstream fin("gfact.in");
ofstream fout("gfact.out");
fin>>p>>q;
descompune();
//for(int i=1;i<=num;i++)
// fout<<v[i].val<<" "<<v[i].nr<<endl;
int drp=1<<30;
cautare(1,drp);
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(int st,int 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;
}
int numarare(int fact,int panaN)
{
int rez=panaN/fact;
int copie=rez;
while(copie>0)
{
rez+=copie/fact;
copie/=fact;
}
return rez;
}