分析:只需要求出最大公约数,然后枚举最大公约数的因子,把他们保存起来在求第K大的;因为是最大公约数的因子必然是两个数的因子。另外循环变量i和个数cnt都要声明为__int64,否则出错。
#include<iostream> #include<algorithm> using namespace std; __int64 gcd(__int64 x,__int64 y) { __int64 r; while(y) { r=x%y; x=y; y=r; } return x; } __int64 f[1000005]; int main() { int T; __int64 X,Y,K,_gcd,i,cnt; scanf("%d",&T); while(T--) { scanf("%I64d %I64d %I64d",&X,&Y,&K); _gcd=gcd(X,Y); cnt=0; for(i=1;i*i<=_gcd;i++) { if(_gcd%i==0) { if(i*i==_gcd) f[cnt++]=i; else { f[cnt++]=i; f[cnt++]=_gcd/i; } } } if(K>cnt) puts("-1"); else { sort(f,f+cnt); printf("%I64d\n",f[cnt-K]); } } return 0; }
时间: 2024-10-12 11:52:04