Pagini recente » Cod sursa (job #1971982) | Cod sursa (job #2671909) | Cod sursa (job #3223735) | Cod sursa (job #1867454) | Cod sursa (job #2216904)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
const int maxv = 1000005;
bitset <maxv> ciur;
vector <int> divizori;
vector <int> prime;
void ciur_()
{
ciur[2] = 1;
for(int i = 2; i < maxv; i++)
ciur[i] = 1;
for(int i = 2; i < maxv; i++)
if(ciur[i] == 1)
for(int j = i + i; j < maxv; j = j + i)
ciur[j] = 0;
}
long long pinex(long long a, long long b)
{
divizori.clear();
for(int i = 2; i < maxv; i++)
if(ciur[i] == 1)
prime.push_back(i);
int lim = sqrt(b);
for(unsigned int i = 0; i < prime.size() && prime[i] <= lim; i++)
{
if(b % prime[i] == 0)
{
divizori.push_back(prime[i]);
while(b % prime[i] == 0)
b /= prime[i];
}
}
if(b != 1)
divizori.push_back(b);
int n = divizori.size();
long long rasp = 0;
for(int conf = 1; conf < (1 << n); conf++)
{
int nrb = 0;
long long p = 1;
for(int i = 0 ; i < n ; ++ i)
{
if(conf & (1 << i))
{
nrb++;
p = p * divizori[i];
}
}
if(nrb % 2 == 1)
rasp += a/p;
else
rasp -= a/p;
}
return a - rasp;
}
int main()
{
long long n, p;
in >> n >> p;
ciur_();
long long st = 1;
long long dr = (1LL << 61);
int ret = 0;
while(st <= dr)
{
long long mij = (st + dr) / 2;
if(pinex(mij, n) > p)
dr = mij - 1;
else if(pinex(mij, n) < p)
st = mij + 1;
else
{
ret = mij;
dr = mij - 1;
}
}
out << ret << "\n";
return 0;
}