poj 2773 容斥原理+二分(求与n的第k互质数)

来源:互联网 发布:firebird sql server 编辑:程序博客网 时间:2024/05/22 20:16

点击打开链接

#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;}


0 0
原创粉丝点击