Cod sursa(job #2330462)
Utilizator | Data | 28 ianuarie 2019 14:02:27 | |
---|---|---|---|
Problema | Frac | Scor | 20 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 3.46 kb |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=(ll)1e6+1233;
class slover
{
private :
ll vll;
ll koko;
bool prie[N];
vector<ll>p;
vector<ll>divi;
ll res;
void go(ll strat,ll sgn,ll prod)
{
if(strat==divi.size())
{
res+=sgn*(vll/prod);
}
else
{
go(strat+1,sgn,prod);
go(strat+1,-sgn,prod*p[strat]);
}
}
public :
void build()
{
p.clear();
for(ll i=2;i<N;i++)
{
prie[i]=1;
}
for(ll i=4;i<N;i+=2)
{
prie[i]=0;
}
for(ll i=3;i*i<N;i+=2)
{
if(prie[i])
{
for(ll j=i*i;j<N;j+=2*i)
{
prie[j]=0;
}
}
}
for(ll i=1;i<N;i++)
{
if(prie[i])
{
p.push_back(i);
}
}
}
ll slove(ll n,ll k)
{
vll=n;
divi.clear();
for(ll i=0;p[i]*p[i]<=n;i++)
{
bool krr=0;
while(n%p[i]==0)
{
krr=1;
n/=p[i];
}
if(krr)
{
divi.push_back(p[i]);
}
}
if(n>1)
{
divi.push_back(n);
}
res=0LL;
go(0,1,1);
ll r=0,pas=(1LL<<60);
while(pas)
{
vll=r+pas;
res=0LL;
go(0,1,1);
if(res<k)
{
r+=pas;
}
pas/=2;
}
r++;
return r;
}
};
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
slover kek;
kek.build();
ll a,b;
cin>>a>>b;
cout<<kek.slove(a,b)<<"\n";
return 0;
}