思路一
O(nlogn)
#include<bits/stdc++.h>
using namespace std;
int a[1000000],cnt[1000000],ans[1000000];
int main()
{
int n,maxn=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
cnt[a[i]]++;//统计数字个数
maxn=max(maxn,a[i]);
}
for(int i=1;i<=n;i++)
{
if(!ans[i])//如果这头牛的数字没有计算过
{
ans[i]=cnt[1];//1是所有数的因数
if(a[i]!=1) ans[i]+=cnt[a[i]];//当前数字是1的话不要加重了
for(int j=2;j<=sqrt(a[i]);j++)
{
if(a[i]%j==0) {
ans[i]+=cnt[j];
if(a[i]/j!=j) ans[i]+=cnt[a[i]/j];//不要加重的情况下每次加一对因数
}
}
}
}
for(int i=1;i<=n;i++) cout<<ans[i]-1<<"
";//自己就不拍自己了
return 0;
}
思路二
枚举每个数i,j=i,j+=i枚举i的倍数