Pagini recente » Cod sursa (job #1004060) | Diferente pentru preoni-2007/runda-4/solutii intre reviziile 15 si 14 | Monitorul de evaluare | Cod sursa (job #702925) | Cod sursa (job #1004054)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
#define MAX_SIZE 100005
#define get_max(a,b) ((a)>(b)?(a):(b))
using namespace std;
ifstream in ( "frac.in" );
ofstream out ( "frac.out" ) ;
long long N , P , Answer , Solution;
bool ciur[MAX_SIZE];
vector < int > divs , divs_nr;
int v[MAX_SIZE];
void Eratosthene ( void )
{
int i , j ;
for ( i = 2 ; i <= MAX_SIZE ; ++i )
if ( ciur[i] == false )
{
divs.push_back( i ) ;
for ( j = i+i ; j <= MAX_SIZE ; ++j )
ciur[j] = true ;
}
}
void MakePrimeNumbers ( void )
{
long long l = sqrtl(N) , j;
divs_nr.push_back(0);
for ( j = 1 ; j < divs.size() && divs[j] <= l ; ++j )
if ( N % divs[j] == 0 )
{
divs_nr.push_back(divs[j]);
while ( N% divs[j] == 0 )
N /= divs[j];
}
if ( N > 1 )
divs_nr.push_back(N);
divs.clear();
}
int p[MAX_SIZE];
void DoPinex ( int k )
{
int i ;
for ( i = v[k-1] +1 ; i <= divs_nr.size() ; ++i )
{
v[k] = i ;
p[k] = p[k-1] * divs_nr[v[k]];
if ( k % 2 )
Answer += N/p[k];
else
Answer -= N/p[k];
if ( k < divs_nr.size() )
DoPinex( k+ 1 );
}
}
void BinarySearch ( void )
{
long long left = 1 , right = ( 1LL <<62 );
p[0] = 1 ;
while ( left <= right )
{
long long middle = ( left + right ) / 2 ;
N = middle ;
DoPinex( 1 ) ;
if ( Answer >= P )
{ Solution = middle , right = middle - 1 ; }
else
left = middle +1 ;
Answer = 0 ;
}
}
int main ( void )
{
in >> N >> P ;
Eratosthene () ;
MakePrimeNumbers();
BinarySearch();
out << Solution ;
in.close();
out.close();
return 0 ;
}