HDU 5019 Revenge of GCD (暴力)

来源:互联网 发布:pscad软件正版价格 编辑:程序博客网 时间:2024/06/07 02:49

题目链接: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;}/*1002 3 12 3 28 16 348 72 348 72 648 72 8*/


1 0
原创粉丝点击