题意:求所有数中任意两个数最大公约数的最大值。
解题思路:先用筛法把所有的数的因子筛出来。时间复杂度是nlogn,然后直接判断就行了。
解题代码:
1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月18日 星期六 19时12分04秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int num[100005]; 28 vector<int>yz[100005] ; 29 void sai() 30 { 31 for(int i = 2;i <= 100000 ;i ++) 32 { 33 int k = i ; 34 while(k <= 100000) 35 { 36 yz[k].push_back(i); 37 k += i ; 38 } 39 } 40 } 41 int hs[100005]; 42 int main(){ 43 sai(); 44 int t; 45 scanf("%d",&t); 46 for(int ca = 1; ca <= t; ca ++){ 47 memset(hs,0,sizeof(hs)); 48 hs[1] = 2; 49 int n ; 50 scanf("%d",&n); 51 for(int i =1 ;i <= n;i ++) 52 { 53 scanf("%d",&num[i]); 54 for(int j =0 ;j < yz[num[i]].size(); j ++){ 55 hs[yz[num[i]][j]] ++ ; 56 } 57 } 58 printf("Case #%d: ",ca); 59 for(int i = 100000; i >= 1 ;i --){ 60 if(hs[i] >= 2 ) 61 { 62 printf("%d ",i); 63 break; 64 } 65 66 } 67 68 } 69 return 0; 70 }