这是一个筛法。
#include<cstdio> #include<algorithm> using namespace std; int n,a[1000005],s[1000005],c[1000005],mx; int main(){ freopen("1607.in","r",stdin); freopen("1607.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); c[a[i]]++; mx=max(a[i],mx); } for(int i=1;i<=mx;i++){ if(c[i]){ for(int j=i;j<=mx;j+=i)s[j]+=c[i]; } } for(int i=1;i<=n;i++)printf("%d\n",s[a[i]]-1); return 0; }