码迷,mamicode.com
首页 > 其他好文 > 详细

第k大公约数(简单数学,逻辑转换)

时间:2018-10-14 13:57:44      阅读:476      评论:0      收藏:0      [点我收藏+]

标签:long   一个   str   space   end   clu   include   begin   turn   

遇到一个挺有意思的题目,要求两个数的第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 }

 

完。

 

第k大公约数(简单数学,逻辑转换)

标签:long   一个   str   space   end   clu   include   begin   turn   

原文地址:https://www.cnblogs.com/redblackk/p/9785806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!