[Codeforces 757B]Bash's Big Day
题目大意:给你n个数,让你找尽可能多的数,使他们的最大公因数大于1。
解题思路:我们先筛出所有的素数,然后对于每个数,对它分解质因子。如果该数包含质因子p,则ans[p]+1,最后统计ans中的最大值即可。类似桶排的思路。
注意如果给你的全是1,则需要输出1而不是0。
C++ Code:
#include<cstdio> #include<cstring> using namespace std; int prime[10005],cnt=0; bool b[100005]; int ans[100005]; int main(){ memset(b,1,sizeof b); b[1]=false; for(int i=2;i<=100005;++i) if(b[i]){ prime[++cnt]=i; for(int j=i+i;j<=100005;j+=i)b[j]=false; } memset(ans,0,sizeof ans); int n; scanf("%d",&n); while(n--){ int x; scanf("%d",&x); if(x>1) for(int i=1;i<=cnt&&prime[i]*prime[i]<=x;++i){ if(x%prime[i]==0){ ++ans[prime[i]]; while(x%prime[i]==0)x/=prime[i]; } }else ans[1]=1; if(x>1)++ans[x]; } int mx=0; for(int i=1;i<=100000;++i)if(mx<ans[i])mx=ans[i]; printf("%d\n",mx); return 0; }