Pagini recente » Cod sursa (job #2071637) | Cod sursa (job #1305786) | Cod sursa (job #1772117) | Cod sursa (job #1639299) | Cod sursa (job #1506429)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
FILE *f = fopen ( "frac.in", "r" );
FILE *g = fopen ( "frac.out", "w" );
vector < int > Divs;
int main(){
long long N, P, cN;
vector < int > :: iterator it;
fscanf ( f , "%lld%lld", &N, &P );
cN = N;
for ( int i = 2; i * i <= cN; ++i ){
if ( cN % i == 0 ){
Divs.push_back(i);
while ( cN % i == 0 )
cN /= i;
}
}
if ( N % cN == 0 )
Divs.push_back(cN);
long long NrDiv = Divs.size(), total =( 1LL << NrDiv ) - NrDiv;
long long st = 1, dr = 100, sum;//( 1LL << 61 ), sum;
while ( st <= dr ){
long long mid = ( st + dr ) >> 1;
bool ok = 1;
sum = 0;
for ( it = Divs.begin(); it != Divs.end(); ++it ){
if ( mid % *it == 0 )
ok = 0;
sum += ( mid / *it );
}
sum -= total;
if ( ok && mid - sum == P ){
fprintf ( g, "%lld", mid );
return 0;
}
if ( mid - sum >= P )
dr = mid - 1;
else
st = mid + 1;
}
return 0;
}