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. 使用pentaho工具将数据库数据导入导出为Excel

    写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工 ...

  2. Js-Html 前端系列--显示有格式的文本

    var dp = $("#dp").val(); var dpXSS = filterXss(dp); document.getElementById("descript ...

  3. 高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用

    高频交易算法研发心得--WAVT指标(Warensoft交易量趋势指标)算法及应用 注:WAVT指标由Warensoft(王宇)原创. 前面聊了一系列的常见应用指标,包括短线.长线的指标,并且也无耐的 ...

  4. sublime vue 语法高亮插件安装

    默认情况下,Vue.js 的单文件组件(*.vue)在 sublime 编辑器中是不被识别的.若要想高亮显示,需要安装插件 Vue Syntax Hightlight.安装步骤如下:   第一,在 s ...

  5. mybatis学习笔记三(关联关系)

    学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.en ...

  6. CODE[VS]-寻找子串位置-字符串处理-天梯青铜

    题目描述 Description 给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置. 输入描述 Input Description 仅一行包含两个字符串a和b 输出描述 ...

  7. CSS继承性+层叠性+盒子+浮动

        CSS继承性+层叠性+盒子+浮动 CSS继承性 <style>         div{             color: pink;             font-siz ...

  8. CodeForces 706C Hard problem

    简单$dp$. $dp[i][0]$:第$i$个串放置完毕,并且第$i$个串不反转,前$i$个串字典序呈非递减的状态下的最小费用. $dp[i][1]$:第$i$个串放置完毕,并且第$i$个串反转,前 ...

  9. mac下 redis安装使用

    安装redis:brew install redis 开启redis服务:redis-server /usr/local/etc/redis.conf 重新打开一个命令窗口:redis-cli ,进入 ...

  10. 【转】【Egit】如何将eclipse中的项目上传至Git

    1.下载egit插件 打开Eclipse,git需要eclipse授权,通过网页是无法下载egit的安装包的.在菜单栏依次打开eclipse→help→install new software→add ...