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

Posted redblackk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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 }

 

完。

 

以上是关于第k大公约数(简单数学,逻辑转换)的主要内容,如果未能解决你的问题,请参考以下文章

[数学] aw3783. 第 k 个除数(求约数+CF762A)

LGP4714「数学」约数个数和

p4714 「数学」约数个数和

网易公开课系列-国防科大公开课-数学建模-第九讲-数学建模综合案例

codeforces 711E 数学

[CSP-S模拟测试]:Divisors(数学)