您的位置:首页 > 其它

HDU-#5019 Revenge of GCD(枚举)

2014-09-19 22:35 429 查看
题目大意:求解两个数的第k大的公约数。

解题思路:先可以求出两个数的最大公约数,然后进行枚举所有因子。用数组存下来,排序输出第K大的因子。这里有几点注意的,枚举时只用枚举是不是最大公约数的因子,需要判断因子的乘方是该最大公约数时,只能存一个。还有一个很坑的地方就是用long long过不了,必须用__int64才行的。详见code。

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5019

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define ll __int64
const int MAXN = 1e5;
int t;
ll x,y,k;
ll num[MAXN];

ll gcd(ll a,ll b){
return b==0 ? a : gcd(b,a%b);
}

int main(){
//freopen("input.txt","r",stdin);
scanf("%d",&t);
while(t--){
memset(num,0,sizeof(num));
ll i,m=0;
scanf("%I64d%I64d%I64d",&x,&y,&k);
ll n=gcd(x,y);
for(i=1;i*i<=n;i++){ //枚举因子
if(n%i==0){
num[m++]=i;
if(i*i!=n) num[m++]=n/i; //因子相同只存一个
}
}
if(m<k){printf("-1\n");continue;}
sort(num,num+m);
printf("%I64d\n",num[m-k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: