Cod sursa(job #3245705)

Utilizator 0021592Grecu rares 0021592 Data 30 septembrie 2024 10:20:40
Problema Frac Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
long long i, j, st, dr, mid, n, mask, k, o;
vector <long long> v;
long long v1[] = {-1, 1};
long long futere()
{
    long long ans = 0;
    for (long long mask = 1; mask < (1ll<<k); mask++)
    {
        long long p = 1, nr = 0;
        for (long long j = 0; j < k; j++)
        {
            if (mask & (1ll << (j)))
            {
                nr++;
                p *= v[j];
            }
        }
        if (nr % 2 == 0)
            ans -= mid/p;
        else
            ans += mid/p;
    }
    ans = mid - ans;
    return ans;
}
void func()
{
    bool ok = 0;
    while (n % i == 0)
    {
        n/=i;
        ok=1;
    }
    if(ok==0)
        return;
    v.push_back(i);
}
int main()
{
    o = 61;
    dr = (1ll<<o) + 1ll;
    in >> n >> o;
    i=2;
    func();
    for (i = 3; i * i <= n; i += 2)
        func();
    if (n != 1)
        v.push_back(n);
    k=v.size();
    while (st <= dr)
    {
        mid = (st+dr)/2;
        long long ans = futere();
        if (ans < o)
            st = mid+1;
        else
            dr = mid - 1;
    }
    out << mid << '\n';
    return 0;
}