http://acm.sgu.ru/problem.php?contest=0&problem=499给定N(<10W)个数,在100W以内,求每两个数最大共因数中最大的。
直接枚举N^2超时,想到都在100W内,则可以以借助筛法来做。从上往下筛,最坏情况下是对于N*ln N<N*lgN。
#define maxn 100010
#define maxm 1000100
using namespace std;
int times[maxm];
int main()
{
int n;
scanf("%d",&n);
clr(times);
for (int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
times[x]++;
}
int i=1000000;
while (i>1)
{
if (times[i]>1)
break;
int j=i+i;
int cnt=times[i];
while (j<=1000000 && cnt<2)
{
cnt+=times[j]; //这里刚刚开始用的是times[i]+=times[j];这样不对,因为像 8这样的情况,会错的!
j+=i;
}
if (cnt>1)
break;
i--;
}
printf("%d\n",i);
return 0;
}