标签:des style blog http color io os java ar
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 430 Accepted Submission(s): 122
条体就是问 a , b 两个数的第k大GCD是什么 -。-
比赛的时候用根号n找出所有GCD, 然后排序 , 结果T 了 。
后来用两个数组分别存 1 ~ sqrt(a) 还有 sqrt(a)~a 的。
其实求的顺序已经一个从小到大, 一个从大到小 。。
然后复杂度是 T * sqrt(n)。。。 0.5秒过了。
之前多加排序 T * ( 2 * sqrt(n) log( 2 * sqrt(n) ) + sqrt(n) ) .. 果断超了~~
#include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <cstdio> using namespace std; typedef long long LL; const int N = 10010 ; LL a , b, k; vector<LL>f1,f2; void cal() { for(LL i = 1; i * i <= a ; ++i ){ if( a % i == 0 ){ if( b % i == 0 ){ f1.push_back(i); } LL temp = a / i ; if( temp != i && b % temp == 0 ){ f2.push_back( temp ); } } } }
int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int cas =1 , _; scanf("%d",&_); while(_--) { scanf("%I64d%I64d%I64d",&a,&b,&k); if( a > b ){ swap(a , b); } f1.clear(); f2.clear(); cal(); int len1 = (int ) f1.size() ,len2 = (int )f2.size(); if( len1 + len2 < k ) puts("-1"); else{ if( k <= len2 ) printf("%I64d\n",f2[ k - 1 ]); else { k -= len2 ;
printf("%I64d\n",f1[len1-k]); } } } return 0; }
标签:des style blog http color io os java ar
原文地址:http://www.cnblogs.com/YRETSIM/p/3982683.html