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

 

完。

 

转载于:https://www.cnblogs.com/redblackk/p/9785806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值