首页 > 代码库 > hdu5019Revenge of GCD(枚举+gcd)
hdu5019Revenge of GCD(枚举+gcd)
题目链接:
huangjing
题意:
求出两个数的第k大的GCD
思路:
首先求出最大公约数,我最开始的思路是打一个很大的素数表,然后不断的进行除,求出第k大的,但是一直re,后来知道可以直接把最大公约数的约数全部求出来,排序即可。。然后因为约数不确定,所以stl里的vector是个不错的选择。
思路:
Revenge of GCD
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 933 Accepted Submission(s): 282
Problem Description
In mathematics, the greatest common divisor (gcd), also known as the greatest common factor (gcf), highest common factor (hcf), or greatest common measure (gcm), of two or more integers (when at least one of them is not zero), is the largest positive integer that divides the numbers without a remainder.
---Wikipedia
Today, GCD takes revenge on you. You have to figure out the k-th GCD of X and Y.
---Wikipedia
Today, GCD takes revenge on you. You have to figure out the k-th GCD of X and Y.
Input
The first line contains a single integer T, indicating the number of test cases.
Each test case only contains three integers X, Y and K.
[Technical Specification]
1. 1 <= T <= 100
2. 1 <= X, Y, K <= 1 000 000 000 000
Each test case only contains three integers X, Y and K.
[Technical Specification]
1. 1 <= T <= 100
2. 1 <= X, Y, K <= 1 000 000 000 000
Output
For each test case, output the k-th GCD of X and Y. If no such integer exists, output -1.
Sample Input
3 2 3 1 2 3 2 8 16 3
Sample Output
1 -1 2
Source
BestCoder Round #10
Recommend
heyang | We have carefully selected several similar problems for you: 5041 5040 5039 5037 5036
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cmath> #include<string> #include<queue> #define eps 1e-9 #define ll long long #define INF 0x3f3f3f3f using namespace std; ll xx,yy,kk; ll gcd(ll a,ll b) { if(b==0) return a; else return gcd(b,a%b); } vector<ll>vec; int main() { ll i; int t; scanf("%d",&t); while(t--) { scanf("%I64d%I64d%I64d",&xx,&yy,&kk); ll ans=gcd(xx,yy); vec.clear(); vec.push_back(1); if(ans!=1) vec.push_back(ans); if(i*i==ans) vec.push_back(i); for(i=2;i*i<ans;i++) { if(ans%i==0) { vec.push_back(i); vec.push_back((ll)ans/i); } } sort(vec.begin(),vec.end()); // printf("%d\n",vec.size()); if(kk>vec.size()) printf("-1\n"); else printf("%I64d\n",vec[vec.size()-kk]); } return 0; }
hdu5019Revenge of GCD(枚举+gcd)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。