Cod sursa(job #3219730)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 31 martie 2024 23:45:21
Problema Frac Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("frac.in");

ofstream fout("frac.out");

vector<int> divizori;

long long int rez(long long int a)
{
    long long int rez1 = a;
    for (int i = 1; i < (1 << divizori.size()); i++)
    {
        long long int sclav = 1;
        int cnt = 0;
        for (int j = 0; j < divizori.size(); j++)
        {
            if ((1 << j) & i)
            {
                sclav *= divizori[j];
                cnt++;
            }
        }

        if (cnt % 2)
            rez1 -= a / sclav;
        else
            rez1 += a / sclav;
    }
    return rez1;
}
int n, p;
int main()
{
    fin >> n >> p;
    int sclav = n;
    for (int i = 2; sclav != 1 && i*i<=n; i++)
    {
        if (sclav % i == 0)
            divizori.push_back(i);
        while (sclav % i == 0)
        {
            sclav /= i;
        }
    }
    if(sclav!=1)
    divizori.push_back(sclav);
    long long int st = 1;
    long long int dr = (1LL << 61);
    long long int sol;
    while (st <= dr)
    {
        long long int mij = (st + dr) / 2;
        long long int k = rez(mij);
        if (k < p)
        {
            st = mij + 1;
            sol = st;
        }
        else
        {
            dr = mij - 1;
        }
    }
    fout<<sol;
}