Cod sursa(job #186318)

Utilizator andrei_infoMirestean Andrei andrei_info Data 27 aprilie 2008 17:04:24
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <cmath>

using namespace std;

#define MAX 50

long long prim[MAX], cntprim, x[MAX];
long long N,P, aux, NR, prod;

void fact( long long x)
{
    long long nr = 2;
    while ( x > 1 )
    {
        if ( x % nr == 0 )
        {
            prim[cntprim++] = nr;
            for ( ; x % nr == 0; x /=nr);
        }

        if  ( nr > (int) sqrt(x))
            nr = x;
        else
            nr++;
    }
}

void back(int k, int n)
{
    if ( k==n+1)
         aux+= NR / prod;
    else
        for ( int i = x[k-1]+1; i<cntprim; i++)
        {
            x[k] = i;
            prod *= prim[i];
            back(k+1, n);
            prod /= prim[i];
        }
}

long long sum(int cnt)
{
    aux =0;
    x[0] = -1;
    prod = 1;
    back(1,cnt);
    return aux;
}

long long numara( long long nr )
{
    long long rez = 0;
    NR = nr;
    for (int i = 1; i<=cntprim; i++)
        if ( i % 2 == 1 )
            rez+= sum(i);
        else
            rez-=sum(i);

    return NR-rez;
}


long long b_search()
{
    long long st= 1, dr = (long long )1<<61, rez=-1;

    while ( st <= dr )
    {
        long long mid = (st+dr)>> 1;
        long long c  = numara(mid);
        if ( c >= P )
        {
            dr = mid - 1;
            rez = mid;
        }
        else
            st = mid +1;
    }
    return rez;
}
int main()
{
    ifstream fin("frac.in");
    ofstream fout("frac.out");

    fin>>N>>P;
    fact(N);

    long long rez = b_search();
    fout<<rez<<"\n";

    return 0;
}