码迷,mamicode.com
首页 > 其他好文 > 详细

BestCoder10 1001 Revenge of GCD(hdu 5019) 解题报告

时间:2014-09-23 00:36:43      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   数据   

题目链接: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 的公共因子,也就符合题目要求啦~~~ 

    

bubuko.com,布布扣
 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 }
View Code

 

BestCoder10 1001 Revenge of GCD(hdu 5019) 解题报告

标签:style   blog   http   color   io   os   ar   for   数据   

原文地址:http://www.cnblogs.com/windysai/p/3987222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!