Cod sursa(job #673431)

Utilizator rootsroots1 roots Data 4 februarie 2012 15:10:07
Problema Frac Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <cstring>
#include <cmath>

#define maxD 34

using namespace std;

ifstream in;
ofstream out;

int d[maxD];

long long P;

inline long long pinex(long long A)
{
    int pow=(1<<d[0]);
    long long sol=A;

    for(int i=1;i<pow;++i)
    {
        long long p=1;
        int b=0;
        for(int cnt=1,j=i;j;j>>=1,++cnt)
            if(j&1) p*=d[cnt],++b;
        if(b&1) p*=-1;
        sol+=A/p;
    }

    return sol;
}

inline long long Bs(long long L,long long R)
{
    if(L<R)
    {
        long long M=L+((R-L)>>1);
        long long cnt=pinex(M);

        if(P<=cnt) return Bs(L,M);
        else return Bs(M+1,R);
    }
    else return L;
}

int main()
{
    long long N;

    in.open("frac.in");

    in>>N>>P;

    in.close();

    memset(d,0,sizeof(d));

    if(N%2==0)
    {
        d[++d[0]]=2;
        while(N%2==0) N/=2;
    }

    double sN=sqrt(N);
    for(int i=3;i<=sN;i+=2)
        if(N%i)
        {
            d[++d[0]]=i;
            while(N%i==0) N/=i;
        }
    if(N!=1) d[++d[0]]=N;

    long long num=Bs(1,1LL<<61);

    out.open("frac.out");

    out<<num<<'\n';

    out.close();

    return 0;
}