Pagini recente » Cod sursa (job #1628713) | Cod sursa (job #16352) | Cod sursa (job #1944826) | Cod sursa (job #1961311) | Cod sursa (job #2795128)
#include <fstream>
#include <bitset>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
#define ull unsigned long long
#define ui unsigned int
const int MaxPrimeNumber=48611;//5000th prime number
bitset <MaxPrimeNumber> ciur;
ui p,q,primeNumbers[5000]= {1,2},base[25],exp[25],dim,cp;
//este factorial de b multiplu de p la q ?
bool isValid(ull b)
{
//cout << "searching binary ... daca " << b << "! este multiplu de " << cp << " la puterea " << q <<endl;
for (ui i=1;i<=dim;++i)
{
ull cnt=0,minLimit=exp[i]*q;
//cout << "how many time do we have " << base[i] << " in " << b << endl;
//cout << " expTotal : " << minLimit << " baza : " <<base[i] << " b : "<< b << " cnt :" << cnt <<endl;
for (ull j=base[i];j<=b && cnt<minLimit;j*=base[i])
{
//cout << " j : " << j << " cnt : "<< cnt << endl;
cnt+=b/j;;
}
//cout << " we have " << base[i] << " in " << b << " " << cnt << " times exponentTotal " << q << " x " << exp[i] << endl;
if (cnt < minLimit)
{
//cout << "nu este o solutie" << endl;
return 0;
}
}
//cout <<"este o solutie "<< endl << endl;
return 1;
}
ull binarySearch(ull left, ull right)
{
ull sol;
while (left<=right){
ull mid=(left+right)/2;
if (isValid(mid))
{
sol=mid;
right=mid-1;
}
else
left=mid+1;
}
return sol;
}
int main()
{
///build ciur
for (int i=3; i<=MaxPrimeNumber; i+=2)
{
if (!ciur[i]) /// is prime ?
{
/// primeNumbers[0] how many prime numbers
primeNumbers[++primeNumbers[0]]=i;
for (ull j=i*i; j<=MaxPrimeNumber; j+=i*2)
{
//cout <<" i : "<< i << " j : " <<j << endl;
ciur[j]=1;
}
}
}
//cout << "ciur ok" << endl;
//for (ull i=0; i<5000; i++)
//{
// cout <<"primeNumber i : " << i << " = " << primeNumbers[i]<<endl;
//}
//return 0;
/*
for(int i = 0 ; i < primeNumbers[0] ; i++)
{
cout << " prime["<<i << "]" << primeNumbers[i] << endl;
}
for(int i = 0 ; i < primeNumbers[0] ; i++)
{
cout << " ciur["<<i << "]" << ciur[i] << endl;
}
*/
//return 0;
cin>>p>>q;
cp=p;
/// descompunem numarul p in factori primi
/// decompose p number in prime numbers factors
for (ui i=1;i<=primeNumbers[0] && primeNumbers[i]*primeNumbers[i]<=p;++i)
{
if (p%primeNumbers[i])
continue;
base[++dim]=primeNumbers[i];
for (;p%primeNumbers[i]==0;p/=primeNumbers[i]) exp[dim]++;
}
if (p>1){ /// prime number
base[++dim]=p;
exp[dim]=1;
}
//cout << endl<<"DIM:"<< dim << endl;
//cout << endl<<"Numar baze ....."<< endl;
//for (int i=1;i<=dim;++i)
//{
// cout<< "i : "<<i<<" baza : "<<base[i] << " exp : "<< exp[i]<<endl;
//}
cout<<binarySearch(1,(ull)cp*(ull)q);
}