Cod sursa(job #1256889)

Utilizator Tester100Tester Tester100 Data 6 noiembrie 2014 23:07:02
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
long long n, k, v[40];
int Max;
inline bool Check(long long Val){
    long long cnt = 0;
    for(int conf = 1;conf < Max; ++conf){
        long long p = 1;
        int nr = 0;
        for(int i = 0;i < v[0]; ++i)
            if((conf&(1<<i))!=0){
                ++nr;
                p =1LL*p*v[i];
            }
        if(nr&1)
            cnt += Val/p;
        else
            cnt -= Val/p;
    }
    cnt = Val-cnt;
    return (cnt >= k);
}
inline void Desc(long long Val){
    int k = 0;
    int p = 2;
    while(Val%2==0){
        Val /= 2;
        ++k;
    }
    if(k)
        v[v[0]++] = 2;
    p = 3;
    while(1LL*p*p <= Val){
        int k = 0;
        while(Val%p==0){
            Val /= p;
            ++k;
        }
        if(k>0)
            v[v[0]++] = p;
        p += 2;
    }
    if(Val > 1)
        v[v[0]++] = Val;
    Max = 1<<v[0];
}
int main()
{
    f >> n >> k;
    f.close();
    Desc(n);
    unsigned long long L = 1,ret = -1,R = 1LL<<62;
    while(L <= R){
        long long Mid = (L+R)/2;
        if(Check(Mid)){
            ret = Mid;
            R = Mid-1;
        }
        else
            L = Mid+1;
    }
    g<<ret<<"\n";
    g.close();
    return 0;
}