Cod sursa(job #3219150)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 30 martie 2024 11:35:56
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin ("frac.in");
ofstream fout("frac.out");
long long t,n,x,sol,k,p,P,A,B;
long long v[50],D[50];
vector <long long> prime;
void backtrack(int pas,int ant,long long nr)
{
    if(ant+1<=k)
    {
        for(int i=ant+1;i<=k;i++)
        {
            v[pas]=D[i];
            P*=D[i];
            backtrack(pas+1,i,nr);
            //fout<<P<<"\n";
            if(pas%2)
                sol+=nr/P;
            else
                sol-=nr/P;
            P/=D[i];
        }
    }
}
long long verif(long long nr)
{
    P=1;
    sol=0;
    backtrack(1,0,nr);
    //fout<<sol<<"\n";
    return nr-sol;
}
int main()
{
    fin>>n>>p;
    for(long long d=2;d*d<=n;d++)
    {
        if(n%d==0)
        {
            D[++k]=d;
            while(n%d==0&&n!=1)
                n/=d;
        }
    }
    if(n!=1)
        D[++k]=n;
    long long st=1;
    long long dr=(1LL<<60);
    while(st<=dr)
    {
        long long mid=(st+dr)/2;
        long long x=verif(mid);
        if(x<p)
            st=mid+1;
        else
            dr=mid-1;
    }
    fout<<st;
    return 0;
}