HDU 5019 Revenge of GCD (暴力)
2014-09-19 21:21
274 查看
题目链接:HDU 5019 Revenge of GCD
题意:求两个数第K大的公共约数。
先求两个数的最大公约数,最大公约数的约数,也就是两个数的公共约数。由于K很大, 扫一遍会超时。sqrt(K)的复杂度刚刚好,记录下他们的约数的一遍,除一下就是另一边的约数。
AC代码:
题意:求两个数第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 */
相关文章推荐
- HDU 5019 Revenge of GCD
- HDU 5019 Revenge of GCD
- hdu 5019 Revenge of GCD(数论,枚举)
- HDU 5019 Revenge of GCD
- HDU 5019 - Revenge of GCD
- HDU 5019 Revenge of GCD
- HDU 5019 Revenge of GCD(数学)
- hdu 5019 Revenge of GCD
- hdu 5019 Revenge of GCD(BestCoder Round #10)
- BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
- hdu 5019 Revenge of GCD
- C - Revenge of GCD HDU - 5019
- HDU 5019 Revenge of GCD 第n个公共约数
- HDU-#5019 Revenge of GCD(枚举)
- HDU 5019 Revenge of GCD(数学)
- HDU 5019 Revenge of GCD
- hdu 5019 Revenge of GCD
- HDU 5019 Revenge of GCD(简单枚举)
- hdu 5019 Revenge of GCD
- hdu5019Revenge of GCD(枚举+gcd)