Cod sursa(job #515310)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 21 decembrie 2010 00:23:45
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<cmath>
#include<cassert>

using namespace std;

long long n, p;
int nd, nr, s[50];
long long divz[50], result, prod;
ofstream g("frac.out");  

void back(int k, long long m) {
    for (int i = 0; i <= 1; i++) {
        s[k] = i;
        if (i == 1) {
            nr++;
            prod *= divz[k];
        }
        if (k == nd) {
            if (nr % 2 == 1)
                result -= m/prod;
            else    
                result += m/prod;  
        }
        else 
            back(k+1, m);
        if (i == 1) {
            nr--;
            prod /= divz[k];
        }
    }    
}

long long trym(long long m) {     
    result = 0;
    prod = 1;
    nr = 0;
    back(1, m);
    return result; 
}

long long bsearch(long long pr, long long u) {
    long long m, x = u+1;
    while (pr <= u) {
        m = (pr+u)/2;
        long long t;
        t = trym(m);
        if (t >= p) {
            u = m-1;
            x = m;
        }
        else 
            pr = m+1;  
    }
    return x;    
}

int main() {
    ifstream f("frac.in");
     
    f >> n >> p;
    assert(n > 1);
    
    long long nn = n;
    long long i;
    for (i = 2; i*i <= nn; i++)
        if (n%i == 0) {
            nd++;
            divz[nd] = i;
            while (n%i == 0) 
                n = n/i;
        }
        
    if (n > 1) {
        nd++;
        divz[nd] = n;
    }
    
    long long x = (long long) 1 << 61; 
    long long result = bsearch(1, x);
    
    g << result << '\n';
    
    return 0;
}