Cod sursa(job #3153331)

Utilizator TudorMMPopescu Tudor Mihai TudorMM Data 29 septembrie 2023 10:31:55
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define int long long

using namespace std;
#define cin in
#define cout out
ifstream in ("frac.in");
ofstream out ("frac.out");

vector <int> divv;

int solv(int a)
{
    int sz=divv.size();
    int k=(1LL<<sz);
    int sum=0;
    for (int i=1; i<k; i++)
    {
        int cnt=0; int part=1;
        for (int pos=0; pos<sz; pos++)
        {
            if (i & (1LL<<pos))
            {
                cnt++; part*=divv[pos];
            }
        }
        if (part>a) continue;
        if (cnt%2==1) sum+=a/part;
        else sum-=a/part;
    }

    return a-sum;
}

void bld(int b)
{
    int d=2;
    while (b>1)
    {
        int cnt=0;
        while (b%d==0 && b>1)
        {
            b/=d; cnt++;
        }
        if (cnt) {divv.push_back(d);}
        d++;

        if (b>1 && d*d>b) d=b;
    }
}

signed main()
{
    int p,n; cin>>n>>p; bld(n);
    int le=0; int ri=(1LL<<62);

    while (le<ri)
    {
        int mid=le+(ri-le+1)/2;

        int cate=solv(mid);
        if (cate>=p) ri=mid-1;
        else le=mid;
    }
    cout<<le+1;
}