先把每个数的出现次数记录。
然后,像筛素数一样把答案筛出来就好了。
#define N 100000
using namespace std;
int n;
int A[N+1];
int cnt[10*N+1];
int Ans[10*N+1];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
cnt[A[i]]++;
}
for(int i=1;i<=10*N;i++)
{
if(cnt[i])
{
for(int j=i;j<=10*N;j+=i)
Ans[j]+=cnt[i];
}
}
for(int i=1;i<=n;i++)printf("%d\n",Ans[A[i]]-1);
return 0;
}
注意要去掉自己。。。。。。