Cod sursa(job #1640757)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 8 martie 2016 19:11:25
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>

#define ll long long
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
ll N,P,D[20],nrdiv;
void read()
{
    fin>>N>>P;
}
void prep(long long nr)
{
    for(ll i=2;i*i <= nr;i++)
        if(nr%i==0)
        {
            D[++nrdiv] = i;
            while(nr%i==0)
                nr/=i;
        }
    if(nr!=1)
        D[++nrdiv] = nr;
}
ll compute(ll val)
{
    ll i,j,pr;
    for(i=1;i<(1<<nrdiv);i++)
    {
        pr = 1;
        for(j=0;j<=nrdiv;j++)
            if((i&(1<<j))>0)
                pr *= -D[j+1];
        val+=N/pr;
    }
    return val;
}
ll solve()
{
    ll st = 1, dr = (1ll<<61),mid;
    while(st<=dr)
    {
        mid = (st+dr)/2;
        if(compute(mid) < P)
            st = mid+1;
        else
            dr = mid-1;
    }
    return st;
}
int main()
{
    read();
    prep(N);
    fout<<solve();
    return 0;
}