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