题意:两个数x,y,求他们第k大的公约数。
思路:先用欧几里德算法求出最大公约数z,然后求z的所有约数,排序,取第k大的。因为z的约数是x,y的公约数的充要条件。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <assert.h>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int main(){
int n;
cin>>n;
while(n--){
ll x,y,k;
cin>>x>>y>>k;
ll z=gcd(x,y);
set<ll> fac;
ll end=sqrt(z+1.0);
for(ll i=1;i<=end;i++){
if(z%i)continue;
fac.insert(i);
fac.insert(z/i);
}
ll cnt=fac.size();
if(k>cnt){
cout<<"-1"<<endl;
}else{
int time=0;
for(set<ll>::iterator it=fac.begin();it!=fac.end();it++){
if(time==cnt-k){
cout<<*it<<endl;
break;
}
time++;
}
}
}
return 0;
}
本文介绍了一种算法,用于找到两个数的第K大公约数。通过使用欧几里德算法找到最大公约数,并进一步求解该最大公约数的所有因子来实现目标。文章包含完整的C++代码实现。
450

被折叠的 条评论
为什么被折叠?



