#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,the_max=0;
int a[100010],cnt[1000010],ans[1000010];
int read(){
int k=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if (ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
k=k*10+ch-'0';
ch=getchar();
}
return f*k;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
for(int i=1;i<=n;i++){
cnt[a[i]]++;
}
for(int i=1;i<=n;i++){
the_max=max(a[i],the_max);
}
for(int i=1;i<=the_max;i++){
if(cnt[i]!=0){
for(int j=i;j<=the_max;j+=i){
ans[j]+=cnt[i];
}
}
}
for(int i=1;i<=n;i++){
printf("%d\n",ans[a[i]]-1);//因为上面一步 ans[j]+=cnt[i];会加上自身,所以减去1
}
return 0;
}
/*
in:
5
2
1
2
3
4
out:
2
0
2
1
3
*/
这这这这显然是大水题,看完题目第一个想法是枚举的n^2;
之后发现完全可以用桶来记元素,然后通过类似于筛法求素数的方法
求出某一个元素的倍数的个数,-1即为答案
一开始交上去发现RE,吓得我赶紧改成了读入优化和printf