Cod sursa(job #2108151)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 17 ianuarie 2018 22:34:05
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("frac.in");
ofstream out("frac.out");

const long long ANSMAX = (1LL << 61);

long long n, p;

long long ans;
vector<long long> factori,pinex;

void descompunere();

long long check(long long arg)
{
    long long ans = arg;

    for(auto it: pinex)
        ans -= arg / it;

    return ans;
}

int main()
{
    in >> n >> p;

    descompunere();

    for(int i = 1; i < (1 << factori.size()); i++)
    {
        long long prod = 1;
        int semn = 0;
        for(int j = 0; j < factori.size(); j++)
            if(i & (1 << j))
            {
                semn++;
                prod *= factori[j];
            }

        prod *= (semn % 2 ? 1 : -1);

        pinex.push_back(prod);
    }

    long long st = 1, dr = ANSMAX, med, val;
    while(st <= dr)
    {
        med = (st + dr) / 2;

        val = check(med);

        if(val < p)
            st = med + 1;
        else
        {
            dr = med - 1;
            if(val == p)
                ans = med;
        }
    }

    out << ans << '\n';

    return 0;
}

void descompunere()
{
    for(long long d = 2; d * d <= n; d++)
        if(n % d == 0)
        {
            factori.push_back(d);
            while(n % d == 0)
                n /= d;
        }

    if(n > 1) factori.push_back(n);
}