ABK
Accepted : 41 | Submit : 245 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
题目描述
ABK是一个比A+B还要简单的题目,给出两个整数A,B,求出A和B的第K大公约数。
输入
第一行是一个整数N(N ≤ 10000),表示样例的个数。 以后每行一个样例,为3个整数A,B,K (1≤A,B≤109 , 1≤K≤10)
输出
每行输出一个整数d,表示A,B的第K大公约数 若没有第K大的公约数则输出-1。
样例输入
7 12 24 1 12 24 2 12 24 3 12 24 4 12 24 5 12 24 6 12 24 7
样例输出
12 6 4 3 2 1 -1
解题思路:不要被109吓到了,其实就是先求出A和B的最大公约数C,然后其第K(k=1,2,3....)大的公约数肯定是其最大公约数C的因子,那么题目就转化成为了求C的第K大因子,是不是看起来就简单了呢。。。
代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int gcd(int a,int b)///求最大公约数
{
return !b ? a : gcd(b,a%b);
}
int main()
{
int t,a,b,k;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&a,&b,&k);
int s=gcd(a,b);
if(k==1) {printf("%d\n",s); continue;}///如果K=1那么直接输出最大公约数
int s1=(int)sqrt(s),f=0,vis[10000];///vis数组用来存最大公约数的因子
for(int i=1;i<=s1;i++)
{
if(s%i!=0) continue;
if(i*i!=s)vis[f++]=i;
vis[f++]=s/i;
}
if(f<k) printf("-1\n");
else{
sort(vis,vis+f);
printf("%d\n",vis[f-k]);
}
}
return 0;
}