Pagini recente » Cod sursa (job #2821427) | Cod sursa (job #2635137) | Cod sursa (job #2873835) | Cod sursa (job #2666812) | Cod sursa (job #542660)
Cod sursa(job #542660)
#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;
}