![](https://file.51nod.com/images/icon/star.png)
![](https://file.51nod.com/images/icon/plus.png)
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Input示例
4 9 15 25 16
Output示例
5
注意到数据最大是100w,我们可以用tot[i]记录i出现的次数,然后枚举所有的可能答案i,统计i,i*2,i*3...i*k的总数s,如果s>=2表示i可以达到。这个过程类似于素数筛的,
所以复杂度是nlog(n);
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int s[50050]; 5 int tot[1000010]; 6 int main() 7 { 8 int n,i,j,k; 9 scanf("%d",&n); 10 for(i=1;i<=n;++i){ 11 scanf("%d",s+i); 12 tot[s[i]]++; 13 } 14 for(i=1000000;i>=1;--i){ 15 int tmp=0; 16 for(j=i;j<=1000000;j+=i){ 17 tmp+=tot[j]; 18 if(tmp>=2) break; 19 } 20 if(tmp>=2){ 21 cout<<i<<endl; 22 break; 23 } 24 } 25 return 0; 26 }