Cod sursa(job #1641150)

Utilizator GinguIonutGinguIonut GinguIonut Data 8 martie 2016 21:15:03
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>

using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
long long n, p, fact[30];
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)
    {
        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=1LL*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;
}