Cod sursa(job #1970288)

Utilizator lucametehauDart Monkey lucametehau Data 19 aprilie 2017 09:23:38
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
///cautam binar rezultatul
///aplicand algoritmul de la problema pinex

#include <fstream>

using namespace std;
ifstream cin("frac.in");
ofstream cout("frac.out");
long long n,k,i,j,m,st,dr,mj,solution,nrdiv,divi[50];
long long p[50000];
bool ciur[110000];
void descompune()
{
    for(i=1;p[i]*p[i]<=n&&i<=m;i++)
    {
        if(n%p[i]==0)
        {
            while(n%p[i]==0)
                n/=p[i];
            divi[++nrdiv]=p[i];
        }
    }
    if(n>1)
        divi[++nrdiv]=n;
}
long long pinex(long long a,long long b)
{
    long long i,j,prod,sol=a,nr;
    for(i=1;i<(1<<nrdiv);i++)
    {
        nr=0;
        prod=1;
        for(j=0;j<nrdiv;j++)
        {
            if((1<<j)&i)
            {
                nr++;
                prod*=1LL*divi[j+1];
            }
        }
        if(nr%2)
            nr=-1;
        else
            nr=1;
        sol+=1LL*nr*a/prod;
    }
    return sol;
}
void cautare_binara()
{
    st=1;
    dr=(1LL<<61);
    while(st<=dr)
    {
        mj=(st+dr)/2;
        if(pinex(mj,n)==k)
        {
            solution=mj;
            dr=mj-1;
        }
        if(pinex(mj,n)<k)
            st=mj+1;
        else
            dr=mj-1;
    }
}
void genereaza()
{
    for(i=2;i<=109545;i++)
        if(ciur[i]==0)
        {
            p[++m]=i;
            for(j=i*i;j<=109545;j+=i)
                ciur[j]=1;
        }
}
int main()
{
    cin>>n>>k;
    genereaza();
    descompune();
    cautare_binara();
    cout<<solution;
    return 0;
}