Happy 2006
Time Limit: 3000MS |
|
Memory Limit: 65536K |
Total Submissions: 9987 |
|
Accepted: 3434 |
Description
The positive integers is said to being relatively prime to all other if the great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are-relatively prime to 2006.
Now your job is easy:for the given integer m, find the k-th element which was relatively prime to m when these elements ar e sorted in ascending order.
Input
The input contains multiple test cases. For each test case, it contains integers m (1 <= m <= 1000000), K (1 <= k <= 100000000).
Output
Output the k-th element in a single line.
Sample Input
2006 12006 22006 3
Sample Output
135
Problem-Solving ideas: The number of binary enumeration 1-2^64 x, find the number of 1-x and M coprime s, here using the principle of tolerance, if s and K equal, then the x is the result;
Reference code:
#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;elsesum-=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;elsel=mid+1;} Cout<<l<<endl;} return 0;}
poj2773 Happy 2006