Cod sursa(job #1641130)

Utilizator GinguIonutGinguIonut GinguIonut Data 8 martie 2016 21:08:47
Problema Frac Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>

using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
long long n, p, fact[1000];
void read()
{
    fin>>n>>p;
}
void prep(long long nr)
{
    for(int i=2;i*i<=n;i++)
    {
        if(nr%i==0)
        {
            fact[++fact[0]]=i;
            while(nr%i==0)
                nr/=i;
        }
        if(nr>1 && i*i>nr)
        {
            fact[++fact[0]]=nr;
            nr=1;
        }
    }
}
long long verif(long long A)
{
    long long sol=A;
    for(int i=1;i<(1 << fact[0]);i++)
    {
        long long prod=1;
        for(int j=0;j<fact[0];j++)
            {
                if((1 << j) & i)
                    prod*=-fact[j+1];
            }
        sol=sol+1LL*A/prod;
    }
    return sol;
}
void solve()
{
    long long st=1, dr=(1LL << 61), poz;
    while(st<=dr)
    {
        long long mid=st+(dr-st)/2;
        if(verif(mid)<p)
            st=mid+1;
        else
        {
            poz=mid;
            dr=mid-1;
        }
    }
    fout<<poz;
}
int main()
{
    read();
    prep(n);
    solve();
    return 0;
}