GCD // HDUの復讐 - 5019 //数論

GCD // HDUの復讐 - 5019 //数論


タイトル

数学において、また、最大公約数(GCF)として知られている最大公約数(GCD)、二つ以上の整数の最大公約数(HCF)、または最大公約数(GCM)、(それらの少なくとも一つである場合ゼロでない)、残りすることなく数字を分割する最大の正の整数です。
-Wikipedia

今日、GCDはあなたに復讐を取ります。あなたはXとYのk番目のGCD把握する必要があり
、入力
テストケースの数を示す、最初の行は、単一の整数Tが含まれています。

各テストケースは三つの整数X、YおよびK.が含まれています

[技術仕様]

  1. 1 <= T <= 100
  2. 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;
}

ご注意ください

長い長い覚えていると、すべてのタイプ

公開された24元の記事 ウォンの賞賛9 ビュー466

おすすめ

転載: blog.csdn.net/salty_fishman/article/details/104011671