GCD // HDUの復讐 - 5019 //数論
タイトル
数学において、また、最大公約数(GCF)として知られている最大公約数(GCD)、二つ以上の整数の最大公約数(HCF)、または最大公約数(GCM)、(それらの少なくとも一つである場合ゼロでない)、残りすることなく数字を分割する最大の正の整数です。
-Wikipedia
今日、GCDはあなたに復讐を取ります。あなたはXとYのk番目のGCD把握する必要があり
、入力
テストケースの数を示す、最初の行は、単一の整数Tが含まれています。
各テストケースは三つの整数X、YおよびK.が含まれています
[技術仕様]
- 1 <= T <= 100
- 1 <= X、Y、K <= 1 000 000 000 000
出力の
各テストケースについて、出力k番目のそのような整数が存在しない場合はXとYのGCD、出力-1。
サンプル入力
3
2 3 1
2 3 2
8 16 3
サンプル出力
1
-1
2
题意
求第kの大的公约数
リンクします。https://vjudge.net/contest/351853#problem/E
思考
最大公約数k番目の最大の要因
コード
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
long long x[1000];
bool cmp(long long a,long long b){
return a>b;
}
long long gcd(long long a, long long b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main(){
int t;
long long a,b,k;
scanf("%d",&t);
while(t--){
memset(x,0,sizeof(x));
cin>>a>>b>>k;
long long d =gcd(a,b);
long long i,cnt=0;
for(i=1; i*i<=d;++i){
if(d%i== 0){
x[cnt++]=i;
if(i*i!= d)
x[cnt++]=d/i;
}
}
if(cnt<k)
cout<<"-1"<<endl;
else{
sort(x, x+cnt,cmp);
cout<<x[k-1]<<endl;
}
}
return 0;
}
ご注意ください
長い長い覚えていると、すべてのタイプ