首先求第k大的gcd,辗转相处的gcd是第一大的,并且第几大的一定是gcd的因数,所以只要乱搞找出即可
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll a,b,k;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%lld%lld%lld",&a,&b,&k);
ll g=gcd(a,b),ans=-1,sq=(int)sqrt(g);
k--;
if (!k)ans=g;
for (int i=2;i<=sq;i++)
if (g%i==0)
{
k--;
if (!k) ans=g/i;
}
if (k)
for (int i=sq;i>=1;i--)
if (g%i==0)
{
if (sq*sq==g) continue;
k--;
if (!k) ans=i;
}
printf("%lld\n",ans);
}
return 0;
}