Cod sursa(job #3291962)

Utilizator cosminccc7Cazacu Cosmin cosminccc7 Data 6 aprilie 2025 14:07:04
Problema Frac Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
int nr_div,nr_elemente;
long long suma,fact,divizor[30],n,p,mij;
bool eratostene[200001];
long long prim[200001],ct;
void back(int k,int nr,long long produs)
{if(nr_div-k<nr_elemente-nr)return ;
for(int i=k;i<=nr_div;i++)
{if(nr==nr_elemente)
suma+=fact*mij/(produs*divizor[i]);
else
back(i+1,nr+1,produs*divizor[i]);}}

int main()
{for(int i=2;i<=200000;i++)
if(!eratostene[i])
{prim[++ct]=i;
    for(int j=2*i;j<=200000;j+=i)
    eratostene[j]=1;}
    in>>n>>p;
    long long st=1,dr=4e18;

   for(int i=1;prim[i]*prim[i]<=n;i++)
    if(!(n%prim[i]))
    {divizor[++nr_div]=prim[i];
    while(!(n%prim[i]))n/=prim[i];
    }
    if(n>1)divizor[++nr_div]=n;

    while(st<=dr)
    {mij=(st+dr)/2;
    suma=0;
    for(int i=1;i<=nr_div;i++)
    {nr_elemente=i;
    if(i%2)fact=1;
    else
    fact=-1;
    back(1,1,1);}
    long long rezultat=mij-suma;
    //out<<suma<<endl;
    if(rezultat==p)
    {out<<mij;
        st=dr+1;
    }
    else
    {if(rezultat>p)
    dr=mij-1;

    else
    st=mij+1;
    }

}
//out<<endl;
//for(int i=1;i<=nr_div;i++)out<<divizor[i]<<" ";
}