Description

In mathematics, the greatest common divisor (gcd), also known as the greatest common factor (gcf), highest common factor (hcf), or greatest common measure (gcm), of two or more integers (when at least one of them is not zero), is the largest positive integer that divides the numbers without a remainder.  ---Wikipedia
Today, GCD takes revenge on you. You have to figure out the k-th GCD of X and Y.

Input

The first line contains a single integer T, indicating the number of test cases. 
Each test case only contains three integers X, Y and K. 
[Technical Specification]  1. 1 <= T <= 100 2. 1 <= X, Y, K <= 1 000 000 000 000

Output

For each test case, output the k-th GCD of X and Y. If no such integer exists, output -1.

Sample Input

3 2 3 1 2 3 2 8 16 3

Sample Output

1 -1 2

________________

题意:

给出x , y 求 第k大的公约数(x,y,k <= 1e12)。

看到这题数据范围直接吓尿,一开始写了个 求最大公约数后枚举约数,意料之中的T了。

然后想到,第k大的公约数,其实就是最大公约数的第k个因子。

 如果枚举最大公约数的因子,最大公约数可能有1e12那么大,显然会t.

那么可以考虑只 枚举一半的因子(因为1e12的约数最多 2* sqrt(1e12) 也就是2e6左右( 这里有点问题,我看别人有用1e6存的,我不知道我想的对不对) )

这样,可以用数组存起来,只要

for( int i = 1 ; i <=sqrt( gcd (x,y) ) ; i++)

{

    if( gcd(x,y) % i == 0 )

        array[cnt++] = i ;

    if( gcd (x,y) / i == 0 )

    array[cnt++] = gcd(x,y) / i ;

}

}

然后对这个数组排序后从大到小取就可以了。别人的代码A了自己的T了一下午。

然后又看到别人的思路

先在  1 - sqrt( gcd(x,y) ) 中找,

第n个小的约数所对应的 gcd(x,y) / n 也就是第n个大的约数。

找不到继续在

( gcd(x,y) ) - 1 区间中找 ,找到的也就是第n个大的约数 ( 这里我说不太清楚,不太好理解,大概可以理解为gcd(x,y)先找一边的约数再找另一边)

代码如下:

#include<iostream>

#include<cstdio>

#include<cmath>

#include<algorithm>

using namespace std;

typedef long long int ll ;

ll gcd ( ll a , ll b )

{

        if ( b == 0 ) return a ;

        else

               gcd(b , a % b );

}

int main()

{

        int t ;

        cin>> t;

        for( int z = 1 ; z <= t ; z++)

        {

               llx,y,k;

               cin>> x >> y >> k ;

               llt = gcd(x,y);

               llnum = 0 , v;

               for( int i = 1 ; i <= sqrt(t) ;i++)

               {

                       if( t % i == 0 )

                       {

                               num++;

                               v=t/i;

                       }

                       if( num == k )

                               break ;

               }

               if( num == k )

                       {cout<< v << endl ; continue;}

               else

                       for( int i = sqrt(t) ; i >=1 ; i--)

                       {

                               if( i*i == t)

                                      continue;

                               if( t % i == 0 )

                                      {

                                              num++;

                                              v=i;

                                      }

                               if( num == k)

                                      break ;

                       }

               if( num == k )

                       cout<< v << endl ;

               else cout << "-1" << endl ;

        }

return 0 ; 

}

——————

不知道为什么T了一下午,照猫画虎对着别人思路都T,重新好几次还T。然后晚上饭后一怒之下又重写一遍莫名AC。。

Revenge of GCD HDU5019的更多相关文章

  1. HDOJ 5019 Revenge of GCD

    Revenge of GCD In mathematics, the greatest common divisor (gcd), also known as the greatest common ...

  2. 数学--数论--HDU 5019 revenge of GCD

    Revenge of GCD Problem Description In mathematics, the greatest common divisor (gcd), also known as ...

  3. HDU 5019 Revenge of GCD(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 Problem Description In mathematics, the greatest ...

  4. BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 题目意思:给出 X 和 Y,求出 第 K 个 X 和 Y 的最大公约数. 例如8 16,它们的公 ...

  5. HDU 5019 Revenge of GCD

    题解:筛出约数,然后计算即可. #include <cstdio> #include <algorithm> typedef long long LL; LL a1[10000 ...

  6. hdu 5018 Revenge of GCD

    题意: 给你两个数:X和Y  .输出它们的第K大公约数.若不存在输出 -1 数据范围: 1 <= X, Y, K <= 1 000 000 000 000 思路: 它俩的公约数一定是gcd ...

  7. hdu 5019(第K大公约数)

    Revenge of GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  9. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

随机推荐

  1. jdk各版本新特性

    只收纳常用的新特性 jdk1.4 1.引入断言 jdk5 1.引入泛型 2.引入枚举Enum 3.可以自动拆装箱 4.引入注解Annotation 5.引入新的迭代方式foreach 6.引入静态导入 ...

  2. Python自学笔记——Matplotlib风羽自定义

    [前言]对于气象专业的小学生来说,风场是预报重要的参考数据,我们所知的风羽有四种:短线代表风速2m/s,长线代表风速4m/s,空心三角代表风速20m/s,实心三角代表风速50m/s.而matplotl ...

  3. JS 处理十六进制颜色渐变算法-输入颜色,输出渐变rgb数组

    html颜色有几种表示方式: 英文单词颜色值:background-color:Blue:十六进制颜色值:background-color:#FFFFFF:  RGB颜色值三元数字:backgroun ...

  4. AndroidStudio引入so文件

    项目中需要引入几个 so文件,但APP一直崩溃报错 java.lang.UnsatisfiedLinkError: Couldn't load ad from loader dalvik.system ...

  5. sql的ExecuteScalar(),ExecuteNonQuery()

    一,ExecuteScalar ExecuteScalar()也返回一个int型变量.如果SQL语句是Select查询,则仅仅返回查询结果集中第一行第一列,而忽略其他行和列.如果SQL语句不是Sele ...

  6. mysql数据一致性检查及修复

    percona-toolkit-2.2.20-1.noarchmysql 5.6.29-logmaster:192.168.166.129slave:192.168.166.131 一.创建数据库校验 ...

  7. 未能加载文件或程序集"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad的真正解决办法

    未能加载文件或程序集"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3 ...

  8. maven项目添加websocket

    最近由于项目业务需求,需要用到websocket来实现即时信息的推送,学习了一下websocket,网上搜了一下学习教程,很多版本看的我云里雾里,最后选择用tomcat提供的最新版本(tomcat 启 ...

  9. C# 匿名方法和拉姆达表达式

    有时候,我们需要封装一组数据,只有数据,没有方法,并且只用于当前程序,不需要在项目间重用,这时候,如果是传统的使用类来封装的话,大概会是下面这种样子: internal class SomeData ...

  10. DOM学习笔记--入门1

    HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准. 首先节点有很多种,不仅仅HTML元素是节点,尤其 要注意文本节点的存在. 根据 W3C 的 HTML DOM 标准,HTML ...