题意:
给出 N 个数,从中挑选几个数,要求每个数的 gcd 不等于 1 ,问满足条件的数集最大有几个数?
思路:
将每个数进行素数分解,统计素数出现的次数,素数中出现最多次的,就是所求最大数集的 gcd ,答案就是它出现次数。
注意到数字1的特殊性,所以在统计时略去。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
bool prime[MAXN+1000];
int n,cut[MAXN+1000],x,a[MAXN+1000][15];//...........................a 用于保存素因子,对于每个小于1e5的数,它的素因子不会超15种
void getP(){
memset(prime,0,sizeof(prime));
memset(a,0,sizeof(a));
prime[0]=prime[1]=1;
for(int i=2;i<=MAXN;i++){//......................................类似素数筛的写法,筛选出每个数的素因子
a[i][++a[i][0]]=i;
if(!prime[i]){
for(int j=2;j*i<=MAXN;j++){
prime[j*i]=1;
a[j*i][++a[j*i][0]]=i;
}
}
}
}
void cont(){//.......................................................统计每个素因子出现次数
for(int i=1;i<=a[x][0];i++)
cut[a[x][i]]++;
}
int main()
{
getP();
ios::sync_with_stdio(false);
while(scanf("%d",&n)!=-1){
memset(cut,0,sizeof(cut));
for(int i=0;i<n;i++){
scanf("%d",&x);
cont();
}
cout<<max(1,*max_element(cut,cut+MAXN+10))<<endl;//...........考虑到只有一个1的情况
}
}