您的位置:首页 > 其它

HDU 5019 Revenge of GCD (暴力)

2014-09-19 21:21 274 查看
题目链接:HDU 5019 Revenge of GCD

题意:求两个数第K大的公共约数。

先求两个数的最大公约数,最大公约数的约数,也就是两个数的公共约数。由于K很大, 扫一遍会超时。sqrt(K)的复杂度刚刚好,记录下他们的约数的一遍,除一下就是另一边的约数。

AC代码:

#include<stdio.h>
#include<math.h>
#include<map>
#include<set>
#define ll __int64
#include<algorithm>
using namespace std;
ll temp=0;
ll gcd(ll a,ll b)
{
	if(b==0)
		return a;
	return gcd(b,a%b);
}
ll m[1001000];
int main()
{
	ll t,i;
	ll x,y,k;
	scanf("%I64d",&t);
	while(t--)
	{
		memset(m,0,sizeof m);
		scanf("%I64d %I64d %I64d",&x,&y,&k);
		ll ans=gcd(x,y);
		ll cnt=1,ss=0;
		for(i=1;i<=(int)sqrt(ans*1.0);i++)
		{
			if(ans%i==0)
			{
				m[cnt++]=ans/i;
				if(i==ans/i)
					ss++;
			}
		}
		ll sum=2*(cnt-1)-ss;
		if(k>sum)
			printf("-1\n");
		else
		{
			ll mid,indx;
			if(sum%2)
			{
				mid=sum/2+1;
				if(k<=mid) printf("%I64d\n",m[k]);
				else
				{
					indx=mid-(k-mid);
					printf("%I64d\n",ans/m[indx]);
				}
			}
			else
			{
				mid=sum/2;
				if(k<=mid) printf("%I64d\n",m[k]);
				else
				{
					indx=mid-(k-mid)+1;
					printf("%I64d\n",ans/m[indx]);
				}
			}
		}
	}
	return 0;
}
/*
100
2 3 1
2 3 2
8 16 3
48 72 3
48 72 6
48 72 8
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: