题目链接
2 4 1 2 3 4 3 3 6 9
Case #1: 2 Case #2: 3
题意:从n个数中,找出两个数之间的最大公约数的最大值。每个数<=100000,n<=100000。
题解:先用nlgn的方法预处理出1到10^5的数的约数。然后再统计出n个数中,每个数是多少个数的约数。最后的答案就是找所有约数中个数大于1的最大的数。
代码如下:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<vector> #define nn 110000 typedef long long LL; const int inf=0x3fffffff; const LL inf64=(LL)inf*inf; using namespace std; vector<int>ve[nn]; int num[nn],n; void init() { int i,j; for(i=1;i<=100000;i++) { for(j=1;(LL)i*j<=100000;j++) { ve[i*j].push_back(i); } } } int main() { init(); int t,cas=1; int i,j,x; scanf("%d",&t); while(t--) { memset(num,0,sizeof(num)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); for(j=0;j<(int)ve[x].size();j++) { num[ve[x][j]]++; } } for(j=100000;j>=1;j--) { if(num[j]>1) break; } printf("Case #%d: %d\n",cas++,j); } return 0; }