首页 > 技术文章 > hdu 5207

tsw123 2015-04-18 22:03 原文

题目大意:
给定一组数,取两个数,使得gcd最大.
分析:
nlogn预处理出105所有数的因子,然后用cnt数组计数给定数的因子个数,再找到最大的i,满足cnt[i]>=2,复杂度为nlogn
学习一下这种思路

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<string>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<stack>
 9 #include<vector>
10 #define INF
11 #define maxn 100100
12 using namespace std;
13 typedef long long LL;
14 int vist[maxn],cnt[maxn];
15 int mm;
16 void solve()
17 {
18     for(int i=2;i<=mm;i++)
19     {
20         for(int j=i;j<=mm;j+=i)
21         {
22             if(vist[j])
23                 cnt[i]+=vist[j];
24         }
25     }//nlogn 的复杂度
26 }
27 
28 int main()
29 {
30     int t,a[maxn],n;
31     scanf("%d",&t);
32     for(int ii=1;ii<=t;ii++)
33     {
34         scanf("%d",&n);
35         memset(vist,0,sizeof(vist));
36         for(int i=1;i<=n;i++)
37         {
38             scanf("%d",&a[i]);
39             vist[a[i]]++;
40             mm=max(mm,a[i]);
41         }
42         memset(cnt,0,sizeof(cnt));
43         solve();
44         cnt[1]=2;
45         printf("Case #%d: ",ii);
46         for(int i=mm;i>=1;i--)
47             if(cnt[i]>=2)
48         {
49             printf("%d\n",i);
50             break;
51         }
52 
53     }
54     return 0;
55 }

 

 

推荐阅读