Cod sursa(job #917640)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 10:55:41
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
using namespace std;
ifstream in("gfact.in");
ofstream out("gfact.out");
long long p, q, b[200], e[200], numar;
void citire();
long long descompunere(long long n);
void construire();
long long cauta();
bool verifica(long long n);
int main()
{
citire();
descompunere(p);
construire();
out << cauta();
in.close();
out.close();
return 0;
}
void citire() { in >> p >> q ;}
long long descompunere(long long n)
{
long long i=2, k;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
k=0;
while(n%i==0)
{
n/=i;
k++;
}
numar++;
b[numar]=i;
e[numar]=k;
}
}
if(n!=1)
{
numar++;
b[numar]=n;
e[numar]=1;
}
}
void construire()
{
for(int f=1;f<=numar;f++)
e[f]*=q;
}
long long cauta()
{
long long i=0, pas= 1LL<<60;
while(pas!=0)
{
if(verifica(i+pas)==0)
i+=pas;
pas>>=1;
}
return i+1;
}
bool verifica(long long n)
{
long long i, exp, aux;
bool r = true;
for(i=1;i<=numar;i++)
{
aux=n;
exp=0;
while(aux>=b[i])
{
exp+=aux/b[i];
aux/=b[i];
}
if(exp<e[i])
r = false;
}
return r;
}