51nod-1179-最大的gcd(数学)

题目来源: SGU
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注
给出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 } 

 

posted @ 2018-04-24 16:10  *zzq  阅读(292)  评论(0)    收藏  举报