zoukankan      html  css  js  c++  java
  • 第k大公约数(简单数学,逻辑转换)

    遇到一个挺有意思的题目,要求两个数的第k大公约数(当然k=1时就是最大公约数),如

    12 6 2

    3

    范围,a和b<=1e14,k<=1e9。

    所以暴力是肯定不行的,这题的关键就是:能被最大公约数整除的一定也是两数的公约数!!这就可以做出来了

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <vector>
     5 #include <cstdio>
     6 #include <cstring>
     7 #include <cmath>
     8 using namespace std;
     9 typedef long long ll;
    10 ll a,b,k;
    11 ll gcd(ll a,ll b)
    12 {
    13     return b?gcd(b,a%b):a;
    14 }
    15 bool cmp(ll aa,ll bb)
    16 {
    17     return aa>bb;
    18 }
    19 vector<ll> vec;
    20 
    21 int main()
    22 {
    23     ios::sync_with_stdio(false); cin.tie(0);
    24 
    25     cin>>a>>b>>k;
    26 
    27     ll ans=gcd(a,b);
    28     for(ll i=1;i*i<=ans;i++)//最大公约数整除的也是公约数!
    29     {
    30         if(ans%i==0)
    31         {
    32             vec.push_back(i);
    33             ll j=ans/i;
    34             if(j!=i) vec.push_back(j);
    35         }
    36     }
    37 
    38     sort(vec.begin(),vec.end(),cmp);
    39     if(k>vec.size()) cout<<"No solution!"<<endl;
    40     else cout<<vec[k-1]<<endl;
    41 
    42     return 0;
    43 }

    完。

  • 相关阅读:
    topcoder srm 681 div1
    topcoder srm 683 div1
    topcoder srm 684 div1
    topcoder srm 715 div1
    topcoder srm 685 div1
    topcoder srm 687 div1
    topcoder srm 688 div1
    topcoder srm 689 div1
    topcoder srm 686 div1
    topcoder srm 690 div1 -3
  • 原文地址:https://www.cnblogs.com/redblackk/p/9785806.html
Copyright © 2011-2022 走看看