Pagini recente » Cod sursa (job #2275356) | Cod sursa (job #127085) | Cod sursa (job #50991) | Cod sursa (job #1043449) | Cod sursa (job #3222664)
#include <fstream>
using namespace std;
ifstream cin ("frac.in");
ofstream cout ("frac.out");
int64_t descompunere[32];
int64_t Prime (const int64_t limita)
{
int64_t prime = 0;
for (int masca = 0 , _limita = (1 << descompunere[0]) ; masca < _limita ; masca++)
{
int setati = 0;
int64_t divizor = 1;
for (int indice = 1 , putere = 1 ; putere <= masca ; indice++ , putere <<= 1)
{ if (masca & putere) { setati++; divizor *= descompunere[indice]; } }
if (setati & 1) { prime -= limita / divizor; }
else { prime += limita / divizor; }
}
return prime;
}
int main ()
{
int64_t valoare , pozitie;
cin >> valoare >> pozitie;
for (int factor = 2 ; factor <= valoare / factor ; factor += (factor == 2 ? 1 : 2)) {
if (valoare % factor == 0)
{
descompunere[++descompunere[0]] = factor;
do { valoare /= factor; }
while (valoare % factor == 0);
}
}
if (valoare > 1)
{ descompunere[++descompunere[0]] = valoare; }
valoare = 0;
int64_t stanga = 1 , dreapta = INT64_MAX;
while (stanga <= dreapta)
{
const int64_t limita = stanga + (dreapta - stanga) / 2;
if (Prime(limita) < pozitie) { stanga = limita + 1; }
else { dreapta = limita - 1; valoare = limita; }
}
cout << valoare;
cout.close(); cin.close();
return 0;
}