H - Happy 2006
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 意解:题目简单易懂,但是要解决这道题目就需要费点功夫了.首先要知道如果一个数与另一个数的gcd不为1,则它们有公共的质因子,所以首先要先算出n的所有最小质 因子,然后分块,加容斥就可以了. 怎么分块呢? 可以这样理解,对于一段数的区间{l,r},可以知道有多少个跟n不互质,这个可以用容斥原理搞定,剩下的就是不断延长区间. 形如[l + x,r + y],这种形式; 具体看代码吧! AC代码:#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef long long ll; vector<int>tp; int main() { int n,k,t; while(~scanf("%d %d",&n,&k)) { tp.clear(); t = n; for(int i = 2; i * i <= n; i++) { if(t % i == 0) { tp.push_back(i); while(!(t % i)) t /= i; } } if(t != 1) tp.push_back(t); ll now,next,Len,ans; Len = tp.size(); now = 1; next = now + k - 1; while(k) { ans = 0; for(int i = 1; i < (1LL << Len); i++) { int mul = 1,tmp = 0; for(int j = 0; j < Len; j++) if((i >> j & 1)) mul *= tp[j],tmp++; if(tmp & 1) ans += next / mul - (now - 1) / mul; else ans -= next / mul - (now - 1) / mul; } k = k - (next - now + 1 - ans); if(!k) break; now = next + 1; next = now + k - 1; } printf("%I64d\n",next); } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。