bzoj P1607
本题用暴力模拟就能过了,但是还是需要加一些优化。。
枚举一下每个a[i]值,然后判断吗??
这样对于10万的数据来说很容易炸。。
所以,我们又发现,相同的a[i]是可以一次算出来的,于是我们就开一个f数组,
表示置为i的数是否被计算过,如果计算过,那么就直接保存答案。。
这个思想类似于记忆化搜索。。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],f[1000010],ans[1000010],q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[a[i]]++,q=max(q,a[i]);
for(int i=1;i<=n;i++){
if(f[a[i]]){
int k=a[i];
while(k<=q){
ans[k]+=f[a[i]];
k+=a[i];
}
}
f[a[i]]=0;
}
for(int i=1;i<=n;i++)printf("%d\n",ans[a[i]]-1);
return 0;
}