类似素数筛,暴力可过,不需要太多的优化
Code:
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
void setIO(string a){
freopen((a+".in").c_str(),"r",stdin);
freopen((a+".out").c_str(),"w",stdout);
}
void end(){
fclose(stdin),fclose(stdout);
}
const int maxn=1000000+5;
int sum[maxn],arr[maxn],MAX,ans[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&arr[i]);
++sum[arr[i]];
MAX=max(MAX,arr[i]);
}
for(int i=1;i<=MAX;++i){
if(!sum[i]) continue;
for(int j=i;j<=MAX;j+=i) ans[j]+=sum[i];
}
for(int i=1;i<=n;++i){
printf("%d\n",ans[arr[i]]-1);
}
return 0;
}