#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e6+20;
const ll inf=1e12;
ll n,k,num,ans;
int fac[N];
void Get(ll n)
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
fac[num++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
fac[num++]=n;
}
ll dfs(int id,ll m)//容斥原理算1~m与n不互质的个数
{
ll cnt=0;
for(int i=id;i<num;i++)
{
cnt+=m/fac[i]-dfs(i+1,m/fac[i]);
}
return cnt;
}
int main()
{
while(cin>>n>>k)
{
num=0;
Get(n);
ll l=1,r=inf;
while(l<=r)//1~x1中与n互质个数小于1~x2中与n互质个数 x1<x2 满足单调性用二分求第k个
{
ll m=(l+r)/2;
ll cnt=m-dfs(0,m);//求1~m中有多少个数与n互质
if(cnt>=k)
{
r=m-1;
if(cnt==k)
ans=m;//记录最左边成立的m
}
else
{
l=m+1;
}
}
cout<<ans<<endl;
}
return 0;
}
poj 2773 容斥原理+二分(求与n的第k互质数)
最新推荐文章于 2019-08-16 09:45:31 发布