题目大意:就是有n个蛤蟆,他们可以必须每次跳a[i]个值的距离,而我们是负责捕捉的,肯定要找最多的相同点,这就相当于一个因数筛,看看这个筛中谁最多(注意我们不可以在0点进行捕捉,并且捕捉点必须小于n)
思路:直接写一个和欧拉筛差不多的因数筛,直接看代码:(朴素版)
这个会在test9中超时,原因:可能输入的全是1,那么会在筛的时候一个一个加,浪费大量的时间,那么我们只需要加一个map优化一下就可以了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+100;
int a[N];
int b[N];
void solve()
{
int n;
cin>>n;
int max=0;
for(int i=1;i<=n;i++)
{
b[i]=0;
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=a[i];j<=n;j+=a[i])
{
b[j]++;
}
}
for(int i=1;i<=n;i++)
{
if(b[i]>max)
{
max=b[i];
}
}
cout<<max<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
优化版(map)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+100;
int a[N];
int b[N];
void solve()
{
map<int,int> mp;
int n;
cin>>n;
int max=0;
for(int i=1;i<=n;i++)
{
b[i]=0;
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]++;
}
for(auto i=mp.begin();i!=mp.end();i++)
{
for(int j=i->first;j<=n;j+=i->first)
{
b[j]+=i->second;
}
}
for(int i=1;i<=n;i++)
{
if(b[i]>max)
{
max=b[i];
}
}
cout<<max<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}