题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019
题目意思:给出 X 和 Y,求出 第 K 个 X 和 Y 的最大公约数。 例如8 16,它们的公约数依次为1 2 4 8,那么第 3 个 GCD(X, Y) = 2,也就是从后往前数第3个公共因子。
TLE思路:求出 X 的所有因子(从小到大开始存储),再从后往前枚举这些因子,检查是否也为 Y 的因子,统计到第 K 个数就是答案了......以为可以顺利通过,原来数据量还是非常大滴!!!
正确思路:先求出 X 和 Y 的最大公约数 r,然后再求出 r 的 所有因子,从后往前数第 K 个就是答案了。这样做的依据是, r 的所有因子一定为 X 和 Y 的公共因子,也就符合题目要求啦~~~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 typedef __int64 ll; 9 const ll maxn = 1e6 + 5; 10 ll X, Y, K, ansi; 11 ll com_factor[maxn]; 12 13 ll gcd(ll x, ll y) 14 { 15 while (y) 16 { 17 ll r = x % y; 18 x = y; 19 y = r; 20 } 21 return x; 22 } 23 24 int main() 25 { 26 int T, cnt; 27 while (scanf("%d", &T) != EOF) 28 { 29 while (T--) 30 { 31 scanf("%I64d%I64d%I64d", &X, &Y, &K); 32 if (X < Y) 33 swap(X, Y); 34 ll r = gcd(X, Y); 35 cnt = 0; 36 for (ll i = 1; i*i <= r; i++) 37 { 38 if (r % i == 0) 39 { 40 com_factor[++cnt] = i; 41 if (r/i != i) 42 com_factor[++cnt] = r/i; 43 } 44 } 45 sort(com_factor+1, com_factor+cnt+1); 46 reverse(com_factor+1, com_factor+cnt+1); 47 printf("%I64d\n", cnt < K ? -1 : com_factor[K]); 48 } 49 } 50 return 0; 51 }
时间: 2024-10-23 07:46:53