我的想法是找到一个整数k,然后看看这里有多少个k的倍数。由于ak的倍数一定是k的倍数,所以合数的倍数个数肯定小于等于它任意一个质因数的倍数个数,所以只需要找到每个质数的倍数个数便可 首先用a统计每个数字出现的次数 然后将a中每个数字分解质因数,所有出现过的质因数对应的倍数个数都加上当前这个数出现的个数。把这些个数放到b里。 然后在b中找最大值就是最后方案了 结果22#数据TLE,求助 代码如下:
#include<bits/stdc++.h>
#include<map>
using namespace std;
int main()
{
int i,j,n,x,ans=0;
map<int,int> a,b;
map<int,int>::iterator p;
cin>>n;
for(i=0;i<n;i++)
{
cin>>x;
a[x]++;
}
for(p=a.begin();p!=a.end();p++)
{
x=p->first;
for(i=2;i<=x;i++)
{
if(x%i==0)
b[i]+=p->second;
while(x%i==0)
x/=i;
}
}
for(p=b.begin();p!=b.end();p++)
if(p->second>ans)
ans=p->second;
if(ans==0 && a.size()>0)
ans=1;
cout<<ans;
return 0;
}