Cod sursa(job #3222664)

Utilizator SSKMFSS KMF SSKMF Data 11 aprilie 2024 10:57:39
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#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;
}