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:
解题思路:先可以求出两个数的最大公约数,然后进行枚举所有因子。用数组存下来,排序输出第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; }
相关文章推荐
- hdu 5019 Revenge of GCD(数论,枚举)
- hdu5019Revenge of GCD(枚举+gcd)
- hdu 5019 Revenge of GCD
- HDU 5019 Revenge of GCD
- HDU 5019 Revenge of GCD
- HDU 5019 Revenge of GCD(数学)
- BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
- hdu 5019 Revenge of GCD
- HDU 5019 - Revenge of GCD
- HDU 5019 Revenge of GCD(数学)
- hdu 5019 Revenge of GCD
- HDU 5019 Revenge of GCD
- hdu 5019 Revenge of GCD(BestCoder Round #10)
- HDU 5019 Revenge of GCD (暴力)
- HDU 5019 Revenge of GCD
- HDU 5019 Revenge of GCD
- C - Revenge of GCD HDU - 5019
- HDU 5019 Revenge of GCD 第n个公共约数
- hdu 5019 Revenge of GCD
- HDU 5019 Revenge of GCD(简单枚举)