题目大意:
给定一组数,取两个数,使得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 }