题意:
给出整数x、y、k,求x、y的第k大公约数。
思路:
其实这道题是在考怎么遍历x和y的所有公因数
只需遍历gcd(x,y)的约数即可
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int x,y,k;
void solve(){
vector<int> v;
cin>>x>>y>>k;
int d=__gcd(x,y);
for(int i=1;i<=d/i;i++){
if(d%i==0){
v.push_back(i);
if(i!=d/i) v.push_back(d/i);
}
}
sort(v.begin(),v.end());
reverse(v.begin(),v.end());
if(k-1>v.size()-1) cout<<-1<<'\n';
else cout<<v[k-1]<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}
总结:
遍历x和y的所有公因数只需遍历gcd(x,y)的约数即可
其实这样比较好理解
由于:
当我们的指数取的比min还小时,就是普遍的公约数了,这样看,公约数就一定是最大公约数的约数
可以拓展一下:当指数取得比max还大时,最小公倍数一定是公倍数的倍数