Cod sursa(job #1142191)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 13 martie 2014 16:30:00
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>

using namespace std;

ifstream in("frac.in");
ofstream out("frac.out");

long long v[20];
int np;

inline long long f(long long n)
{
    long long sum, prod, nc;
    int i, j;

    sum = 0;
    for(i = 0; i < (1 << np); i++)
    {
        nc = 0;
        prod = 1;
        for(j = 0; j < np; j++)
            if(i & (1 << j))
            {
                nc++;
                prod *= v[j];
            }

        if(nc % 2)
            sum -= n/prod;
        else
            sum += n/prod;
    }

    return sum;
}

int main()
{
    long long n, p, nnew, nrprim, pas, i;

    in>>n>>p;

    if(n == 1)
    {
        out<<p<<'\n';
        return 0;
    }

    np = 0;
    nnew = n;
    nrprim = 2;
    if(nnew % nrprim == 0)
    {
        v[np] = nrprim;
        np++;
        while(nnew % nrprim == 0)
         nnew /= nrprim;
    }
    nrprim = 3;
    while(nrprim * nrprim <= nnew)
    {
        if(nnew % nrprim == 0)
        {
            v[np] = nrprim;
            np++;
            while(nnew % nrprim == 0)
                nnew /= nrprim;
        }
        nrprim += 2;
    }

    if(nnew != 1)
    {
        v[np] = nnew;
        np++;
    }

    pas = 1LL << 61;
    i = 0;
    while(pas)
    {
        if(f(i + pas) < p)
            i += pas;
        pas /= 2;
    }

    out<<i + 1<<'\n';
    return 0;
}