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