Cod sursa(job #3305071)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 29 iulie 2025 17:43:47
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

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

bool IsPrime [1000002];
vector <int> primes;

void Ciur(){
    IsPrime[0] = 0;
    IsPrime[1] = 0;
    for (int i=2;i<=1000000;++i){
        IsPrime[i] = 1;
    }
    for (int i=2;i<=1000000;++i){
        if (IsPrime[i]==1){
            for (int j=2*i;j<=1000000;j+=i){
                IsPrime[j] = 0;
            }
        }
    }
    for (int i=2;i<=1000000;++i){
        if (IsPrime[i]==1) primes.push_back(i);
    }
}

void Get_Fact(int B,vector <int> &fct){
    int cB = B;
    for (auto x:primes){
        if (cB%x==0) fct.push_back(x);
        while (cB%x==0){
            cB /= x;
        }
    }
    if (cB>1){
        fct.push_back(cB);
    }
}

int Query(int A,int B){
    vector <int> fct;
    Get_Fact(B,fct);
    int n = fct.size();
    int ans = 0;
    for (int mask=0;mask<(1<<n);++mask){
        int m_prod = 1;
        int cnt = 0;
        int val = 1;
        for (int bit=0;bit<n;++bit){
            if (mask&(1<<bit)){
                val *= fct[bit];
                cnt++;
            }
        }
        m_prod = A/val;
        int Ior_I = 1;
        if (cnt%2==1) Ior_I = -1;
        ans += m_prod*Ior_I;
    }
    return ans;
}

signed main()
{
    Ciur();
    int n,p;
    fin >> n >> p;
    int L = 1,R = (1LL<<61);
    int ans = 0;
    while (L<R){
        int M = (L+R)/2;
        if (Query(M,n)<p) L = M+1;
        else{
            R = M;
            ans = M;
        }
    }
    fout << L;
    return 0;
}