题目:
题解:
暴力枚举约数会超时,我们把找
a
[
i
]
a[i]
a[i]有几个约数转化为
a
[
i
]
a[i]
a[i]是几个数的倍数
首先数出 a [ i ] a[i] a[i]的个数 c o n [ a [ i ] ] con[a[i]] con[a[i]]
然后对于存在的 c o n [ a [ i ] ] con[a[i]] con[a[i]]枚举倍数的个数,最后输出即可
#include <bits/stdc++.h>
using namespace std;
long long a[100005];
long long con[1000005];
long long ans[1000005];
int main()
{
long long n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
con[a[i]]++;
}
for(int i=1;i<=1e6;i++)
{
for(int j=i;j<=1e6;j+=i)
{
ans[j]+=con[i];
}
}
for(int i=1;i<=n;i++)
{
cout<<ans[a[i]]-1<<endl;
}
return 0;
}