题意:求x与y的第k大的公约数
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019
解题思路:在公约数范围内暴力枚举即可。
注意点:搜索时通过开方减少搜索次数,将复杂度从O(n)降为O(sqrt(n)),避免TLE
AC代码如下:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
11688233 | 2014-09-19 23:57:58 | Accepted | 5019 | 343MS | 452K | 1425 B | G++ |
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
bool cmp ( const long long &a, const long long &b )
{
return a > b ? a : b;
}
long long gcd ( long long x, long long y )
{
if ( y == 0 )
{
return x;
}
else
{
return gcd ( y, x % y );
}
}
int main()
{
int t;
cin >> t;
while ( t -- )
{
set<long long> num;
long long a, b, c;
cin >> a >> b >> c;
long long tmp = gcd ( a, b );
long long cnt = 0;
num.insert( tmp );
for ( long long i = sqrt( tmp ); i > 0; i -- )
{
if ( tmp == i )
{
num.insert( i );
cnt ++;
continue;
}
if ( tmp % i == 0 )
{
num.insert( i );
num.insert( tmp / i );
cnt += 2;
}
}
set<long long>::reverse_iterator it;
long long n = 0;
for ( it = num.rbegin(); it != num.rend(); it ++ )
{
n ++;
if ( n == c )
break;
}
if ( c <= cnt )
{
cout << *it << endl;
}
else
{
cout << -1 << endl;
}
}
return 0;
}