题目大意
有 n n n 只青蛙,初始时在坐标轴 0 0 0 处。第 i i i 只青蛙 1 1 1 秒可以跳 a i a_i ai 远(即第 2 2 2 秒位于坐标轴 a i a_i ai 处,依此类推)。你可以在 1 1 1 ~ n n n 中选一个点布置陷阱,所有踩到这个陷阱的青蛙都会被你捉住。问最多可以捉住多少只青蛙?
解题思路
若陷阱布置在点
x
x
x 处,不难发现若
x
x
x 整除
a
i
a_i
ai ,则
i
i
i 青蛙就可以被捉住(即
x
x
x 是
a
i
a_i
ai 的倍数时,若干时间后青蛙一定会跳进陷阱)。于是我们考虑遍历点
1
1
1 至点
n
n
n ,对于点
x
x
x ,遍历它的所有因数,加起来(这里有一个预处理的操作)后取最大值即可(其实看代码更易理解)。
代码示例
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t,n,a[200010],dp[200010],ans=0;
//dp只是预处理数组而已,没什么别的含义...
int getans(int x){
int sum=0;
for(int i=1;i*i<=x;i++){
if(x%i==0){
if(i*i==x) sum+=dp[i];
else sum+=dp[i],sum+=dp[x/i];
}
}
return sum;
}
signed main(){
cin>>t;
while(t--){
memset(dp,0,sizeof(dp));
ans=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//预处理
for(int i=1;i<=n;i++) if(a[i]<=n) dp[a[i]]++;
for(int i=1;i<=n;i++) ans=max(ans,getans(i));
cout<<ans<<endl;
}
return 0;
}