HDU 5019 簡(jiǎn)單數(shù)學(xué)題
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-09-29 16:05:09 閱讀次數(shù):3028次
這道題是說(shuō)給定A和B,求第C大的公約數(shù)。
我們最長(zhǎng)求的就是最大公約數(shù)了,也就是通常用的GCD算法。但是現(xiàn)在要求第C大的公約數(shù),我們可以想見(jiàn)如果令第C大的公約數(shù)為x,最大公約數(shù)為g的話,那么x|g的,為什么呢?
我們可以直觀的理解,最大公約數(shù)其實(shí)就是A和B分別進(jìn)行素因子分解之后,能取到公共素因子乘起來(lái)得到的。而對(duì)于任意A、B的公約數(shù),那么肯定包含了部分的最大公約數(shù)所包含的素因子,因此x|g。
于是要求第C大的公約數(shù),只需要枚舉g的因子就行了,我們知道求一個(gè)數(shù)的因子情況,是可以進(jìn)行O(sqrt(n))的枚舉的,這道題n的范圍就是10^12,所以復(fù)雜度內(nèi)是夠的。
但是好久沒(méi)有寫(xiě)這種卡時(shí)限很緊的題了,稍微把判斷寫(xiě)多了或者多枚舉了一些內(nèi)容就tle了,確實(shí)很無(wú)力。還是自己太渣。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef __int64 LL;
LL gcd(LL a, LL b)
{
if(b==0)
return a;
return gcd(b, a%b);
}
int main()
{
LL a, b, c;
int T;
vector<LL> v;
scanf("%d", &T);
while(T--)
{
scanf("%I64d%I64d%I64d", &a, &b, &c);
LL temp = gcd(a, b);
v.clear();
int cnt = 0;
for(LL i=1; i*i<=temp; ++i)
{
if(temp%i==0)
{
v.push_back(i);
if(i*i!=temp)
v.push_back(temp/i);
}
}
sort(v.begin(), v.end());
if(v.size() >= c)
printf("%I64d
", v[v.size()-c]);
else
printf("-1
");
}
return 0;
}
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)