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;
}