[POJ 2773] Happy 2006【gcd】
Problem:
Time Limit: 3000MS | Memory Limit: 65536K |
Description
Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are all relatively prime to 2006.
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
Source
Solution:
一道很好的 gcd。。
我们发现 m 的范围比较小,所以可以 O(m) 枚举,O(logm) 辗转相除求出 ≤ m 的与 m 互质的数。
然后由辗转相除法得 gcd(at+b, a) = gcd(a, b),即如果 b 与 a 互质,则 at+b 与 a 也互质。
所以我们发现与 a 互质的数循环出现,枚举所在循环节求解即可。
Code: O(Tmlogm) [3808K, 2407MS]
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int m, k, rp[1000005], rpcnt; inline int gcd(int a, int b) {return !b ? a : gcd(b, a % b);} int main(){ while(scanf("%d%d", &m, &k) != EOF){ rpcnt = 0, k--; for(register int i = 1; i <= m; i++) if(gcd(i, m) == 1) rp[rpcnt++] = i; ll ans = rp[k % rpcnt] + m * (k / rpcnt); printf("%lld\n", ans); } return 0; }
发表评论