Cod sursa(job #2216904)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 28 iunie 2018 12:45:20
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#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;
}