Cod sursa(job #542660)

Utilizator nandoLicker Nandor nando Data 26 februarie 2011 19:13:16
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <cstdlib>
#include <iostream>
using namespace std;


typedef long long int64;

class fracApp {
public:
    fracApp ()
    {
        fin.open ("frac.in", ios::in);
        fout.open ("frac.out", ios::out);

        nf = 0;
        fin >> n >> p;
    }

    void run ()
    {

        factorize ();


        for (int i = 0; i < (1 << nf); ++i) {

            int64 f = 1;
            for (int j = 0; j < nf; ++j) {
                if (i & (1 << j)) {
                    f *= -fact[j];
                }
            }
            prod[i] = f;
        }
        search ();
    }

    ~fracApp ()
    {
        fout << sol + 1 << endl;
        fin.close ();
        fout.close ();
    }
private:
    void factorize ()
    {
        if (!(n & 1)) {
            while (!(n & 1)) {
                n >>= 1;
            }
            fact[nf++] = 2;
        }

        for (int64 i = 3; i * i <= n; i += 2) {
            if (n % i == 0) {
                fact[nf++] = i;
                while (n % i == 0) {
                    n /= i;
                }
            }
        }
        if (n > 1) {
            fact[nf++] = n;
        }
    }

    int64 func (int64 x)
    {
        int64 res = 0;
        for (int i = 0; i < (1 << nf); ++i) {
            res += x / prod[i];
        }
        return res;
    }

    void search ()
    {
        int64 beg = 0, step = 1LL << MAXB;

        for (sol = 0; step; step >>=1) {
            if (func(sol + step) < p) {
                sol += step;
            }
        }
    }
private:
    static const int MAXN = 20, MAXP = 4010, MAXB = 61;

    fstream fin, fout;

    int64 fact[MAXN], prod[MAXP];
    int64 nf, n, p, sol;
};

int main ()
{
    fracApp* app = new fracApp ();

    app->run ();

    delete app;

    return EXIT_SUCCESS;
}