poj2773 Happy 2006
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 9987 | Accepted: 3434 |
Description
Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.
Input
Output
Sample Input
2006 1 2006 2 2006 3
Sample Output
1 3 5
解题思路:二分枚举1-2^64之间的数x,找到1-x与m互质的个数s,这里利用容斥原理,如果s与k相等,那么该x即为结果;
参考代码:
#include <iostream> #include <vector> #include <math.h> using namespace std; typedef long long ll; const int MAX = 1000010; int p[MAX],count; void fun(ll n){ ll i; count=0; for (i=2;i*i<=n;i++){ if (n%i==0){ p[count++]=i; while (n%i==0) n/=i; } } if (n>1) p[count++]=n; } ll solve(ll n,ll r){ ll sum=0; for (int i=1;i<(1<<count);i++){ ll mult=1,bits=0; for (int j=0;j<count;j++){ if (i&(1<<j)){ bits++; mult*=p[j]; } } ll cur=r/mult; if (bits%2==1) sum+=cur; else sum-=cur; } return r - sum; } int main(){ ll n,m,mid,num; while (cin>>n>>m){ fun(n); ll r=0xffffffff,l=1; while (r-l>0){ mid=(r+l)/2; num=solve(n,mid); if (num>=m) r=mid; else l=mid+1; } cout<<l<<endl; } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。