hdu 5207

时间:2021-04-18 13:14:19
题目大意:
给定一组数,取两个数,使得gcd最大.
分析:
先nlogn预处理出105所有数的因子,然后用cnt数组计数给定数的因子个数,再找到最大的i,满足cnt[i]>=2,复杂度为nlogn。
学习一下这种思路
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#define INF
#define maxn 100100
using namespace std;
typedef long long LL;
int vist[maxn],cnt[maxn];
int mm;
void solve()
{
for(int i=;i<=mm;i++)
{
for(int j=i;j<=mm;j+=i)
{
if(vist[j])
cnt[i]+=vist[j];
}
}//nlogn 的复杂度
} int main()
{
int t,a[maxn],n;
scanf("%d",&t);
for(int ii=;ii<=t;ii++)
{
scanf("%d",&n);
memset(vist,,sizeof(vist));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
vist[a[i]]++;
mm=max(mm,a[i]);
}
memset(cnt,,sizeof(cnt));
solve();
cnt[]=;
printf("Case #%d: ",ii);
for(int i=mm;i>=;i--)
if(cnt[i]>=)
{
printf("%d\n",i);
break;
} }
return ;
}