//poj 2773
//sep9
#include <iostream>
using namespace std;
const int MAX=1000;
int n,k,cnt,t;
bool vis[MAX+10];
int prime[MAX+10],a[MAX+10];
void get_prime()
{
int tmp=n;
t=0;
for(int i=0;i<cnt&&prime[i]*prime[i]<=n;++i){
if(tmp% prime[i]==0){
a[t++]=prime[i];
while(tmp%prime[i]==0)
tmp/=prime[i];
}
}
if(tmp!=1)
a[t++]=tmp;
}
int judge(int num)
{
int sum=0;
for(int i=1;i<(1<<t);++i){
int tmp=1;
int p=0;
for(int j=0;j<t;++j){
if((i>>j)&1){
p++;
tmp*=a[j];
}
}
if(p%2==1)
sum+=num/tmp;
else
sum-=num/tmp;
}
return num-sum;
}
int main()
{
cnt=0;
memset(vis,false,sizeof(vis));
for(int i=2;i<MAX;++i){
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<MAX;++j){
vis[i*prime[j]]=true;
if(!i%prime[j])
break;
}
}
while(scanf("%d%d",&n,&k)==2){
get_prime();
int l=1,r=999999999,mid,ans;
while(l<r){
mid=(l+r)/2;
int num=judge(mid);
if(num>=k){
if(num==k)
ans=mid;
r=mid;
}else
l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}
poj 2773 Happy 2006 容斥原理+筛素数+二分
最新推荐文章于 2018-08-10 16:13:43 发布