标签:
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
输出两两之间最大公约数的最大值。
4 9 15 25 16
5
思路:枚举最大公约数,然后用类似筛法的方式判断当前的约数是否在原数组中存在两个或两个以上的数是他的倍数。复杂度n*log(n);
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<math.h> 7 #include<set> 8 #include<vector> 9 #include<string.h> 10 using namespace std; 11 typedef long long LL; 12 int ans[1000005]; 13 int main(void) 14 { 15 int n,m; 16 scanf("%d",&n); 17 int i,j; 18 memset(ans,0,sizeof(ans)); 19 int t; 20 int maxx = 0; 21 for(i = 0; i < n; i++) 22 { 23 scanf("%d",&t); 24 ans[t]++; 25 maxx = max(maxx,t); 26 } 27 LL c = 0;int v ; 28 for(i = maxx; i >= 1 ; i--) 29 { 30 v = 0; 31 for(j = 1; ((LL)i*(LL)j)<= maxx ; j++) 32 { 33 v+=ans[i*j]; 34 if(v>=2) 35 { 36 c = i; 37 break; 38 } 39 } 40 if(c) 41 break; 42 } 43 printf("%d\n",c); 44 return 0; 45 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5833076.html