题目:Revenge of GCD
题目链接:https://vjudge.net/contest/351853#problem/E
题目描述:找a,b的第k大公因数。
题目分析:找gcd(a,b)第k大因数。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
ll gcd(ll x,ll y) //找最大公因数
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
ll t,i,a,b,k,d,j,h;
int cd1[100000];//存比较大的因数
ll cd2[100000];
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&a,&b,&k);
d=gcd(a,b);
for(i=1,j=0,h=0;i*i<=d;i++)
{
if(d%i==0)//每次成立可在两个因数
{
if(i==d/i) {cd2[++h]=i;break;}//因为两个得到的的因数可能相等,
//所以特别存起来,方便连接
cd1[++j]=i;//存小因数
cd2[++h]=d/i;//存大因数
}
}
for(h++;j>0;j--)//连接两个数表
{
cd2[h++]=cd1[j];
}
if(k<h) printf("%lld\n",cd2[k]);
else printf("-1\n");
}
return 0;
}