Pagini recente » Cod sursa (job #196360) | Cod sursa (job #308596) | Cod sursa (job #1661293) | Cod sursa (job #2436717) | Cod sursa (job #1869030)
#include <fstream>
using namespace std;
ofstream fout ("frac.out");
ifstream fin ("frac.in");
long long n,p,aux,nrdiv,nrdivpin,nrprime,cs,cd,mij,suma,diviznr[100005],rsp;
bool eprim[100005];
int prime[100005];
void ciur()
{
eprim[ 1 ] = 1;
for( int i = 2 ; i <= 1e5 ; i++ )
{
if( eprim[ i ] == 0 )
{
prime[ ++nrprime ] = i;
for( int j = i + i ; j <= 1e5 ; j++ )
eprim[ j ] = 1;
}
}
}
void divizorii( long long n )
{
for( int i = 1 ; i <= nrprime ; i++ )
{
if( n % prime[ i ] == 0 )
{
diviznr[ ++nrdiv ] = prime[ i ];
while( n % prime[ i ] == 0 )
n /= prime[ i ];
}
}
if( n != 1 )
diviznr[ ++nrdiv ] = n;
}
long long pinex( long long nr )
{
suma = 0;
for( int i = 1 ; i < ( 1 << nrdiv ) ; i++ )
{
rsp = 1;
nrdivpin = 0;
for( int j = 0 ; j < nrdiv ; j++ )
{
if( i & ( 1 << j ) )
{
rsp *= diviznr[ j + 1 ];
nrdivpin++;
}
}
if( nrdivpin % 2 )
suma += nr / rsp;
else
suma -= nr / rsp;
}
return nr - suma;
}
int main()
{
fin>>n>>p;
ciur();
divizorii( n );
cs = 1;
cd = ( 1LL << 61 );
while( cs <= cd )
{
mij = ( cs + cd ) / 2;
if( pinex( mij ) >= p )
{
rsp = mij;
cd = mij - 1;
}
else
cs = mij + 1;
}
fout<<rsp;
}