Cod sursa(job #1127331)

Utilizator misinozzz zzz misino Data 27 februarie 2014 12:00:48
Problema Frac Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<fstream>
#define ll long long
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
ll p,n,nr,mij,sol,d,li,ls,di[40];
ll put;
inline ll verif(ll x)
{
    int nrb,c;
    ll sol=x;
    for(int conf=1;conf<=put;++conf)
    {
        nrb=0;
        c=1;
        for(int i=0;i<nr;++i)
        if(conf&(1<<i))
        c*=di[i],++nrb;
        if(nrb%2)
        sol-=x/c;
        else
        sol+=x/c;
    }
    return sol;
}
int main()
{
    f>>n>>p;
    for(d=2;d*d<=n;++d)
    if(n%d==0)
    {
        di[nr++]=d;
        while(n%d==0)
        n/=d;
    }

    if(n!=1)
    di[nr++]=n;
    put=(1<<nr)-1;
    li=1;
    ls=1LL<<61;
    while(li<=ls)
    {
        mij=(li+ls)>>1;
        if(verif(mij)>=p)
        ls=mij-1,sol=mij;
        else
        li=mij+1;
    }
    g<<sol<<'\n';
    return 0;
}