• 第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 }

    完。

  • 相关阅读:
    js数组
    关于编程,程序员的一些语录
    css心得
    js函数
    一些电脑基础知识
    gnome3安装
    C学习小记
    ubuntu重装系统后
    elinks文字浏览器
    快捷方式
  • 原文地址:https://www.cnblogs.com/redblackk/p/9785806.html
Copyright © 2020-2023  润新知