hdu 5019 gcd

来源:互联网 发布:mac os x sierrad安装 编辑:程序博客网 时间:2024/06/16 05:27

求第k大的gcd ,一定是gcd的因数,可以利用sqrt(n)的算法求出,然后再进行排序即可o(1)的查询

注意i要用LL,要不然会溢出,wrong了无数次大哭

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;typedef __int64 LL;LL gcd ( LL a , LL b ){    if ( b == 0 ) return a;    return gcd ( b , a%b );}int main ( ){    int t;    LL a , b , c;    scanf ( "%d" , &t );    vector<LL> v;    while ( t-- )    {        v.clear ( );        scanf ( "%I64d%I64d%I64d" , &a , &b , &c );        LL temp = gcd ( a , b );        for ( LL i = 1 ; i*i <= temp ; ++i )        {            if ( temp%i == 0 )            {                v.push_back ( i );                if ( temp != i*i )                     v.push_back ( temp/i );            }        }        sort ( v.begin() , v.end());        if ( c <= v.size( ) )             printf ( "%I64d\n" , v[v.size()-c] );        else printf ( "-1\n" );    }    return 0;}


0 0