zoukankan      html  css  js  c++  java
  • hdu 5019 第k大公约数

    题意:
          给你两个数,让你求他们的第k大公约数。

    思路:

          这个比较好想,我的做法是先求出最大公约数,他们的公共因子一定是最大公约数的因子,所以直接log(gcd(A,B))的时间复杂度就枚举出来了,这个题目的最小(也许别人会更快)的时间复杂度应该是log(gcd(A ,B)) ,就是枚举的时候所用的时间,我为了偷懒,枚举的时候没有开记录的东西,直接存数组里面了,最后还排序了,所以慢,如果说最大公约数的因子个数为n,那么我的时间复杂度应该是 n * log(n) 也就是log(gcd(A ,B)) * 2 * log(log(gcd(A ,B)) * 2) 因为n = log(gcd(A ,B)) * 2 ,看着这个时间复杂度感觉有点乱,不过不要在意这些细节,这个时间复杂度AC还是没有压力的。


    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    
    using namespace std;
    
    __int64 num[1100000];
    
    __int64 GCD(__int64 A ,__int64 B)
    {
       return A % B == 0 ? B : GCD(B ,A % B);
    }
    
    int main ()
    {
       __int64 A ,B ,K ,I ,T;
       scanf("%I64d" ,&T);
       while(T--)
       {
          scanf("%I64d %I64d %I64d" ,&A ,&B ,&K);
          __int64 tmp = GCD(A ,B);
          int nowid = 0;
          for(I = (__int64)(sqrt(tmp*1.0)) ;I >= 1 ;I --)
          {
             if(tmp % I == 0) 
             {
                num[++nowid] = I ;
                if(I * I != tmp)
                num[++nowid] = tmp / I;
             }
          }
          sort(num + 1 ,num + nowid + 1);
          if(nowid < K) printf("-1
    ");
          else printf("%I64d
    " ,num[nowid - K + 1]);
       } 
       return 0;
    }
    

  • 相关阅读:
    Android连载7-动语添加碎片
    JavaScript连载6-转化为Number和Boolean类型、运算符
    Java连载111-timer定时器、反射机制概述
    用conda创建虚拟环境的一些常用命令
    Java内存分析
    Java语言中的Class类
    线程协作
    LeetCode刷题笔记第26题
    LeetCode刷题笔记第20题(括号匹配)
    LeetCode刷提笔记第1332题
  • 原文地址:https://www.cnblogs.com/csnd/p/12062758.html
Copyright © 2011-2022 走看看