莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 我们一般不会直接求某个数的约数,而是从某个数的倍数的角度求解
2. 先统计每个数出现的次数
3. j 是 i 的倍数,枚举 1~1000000 中每个数,都要使 j 加上 i 出现的次数
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n;
int a[N],cnt[N],s[N];
int main()
{
cin>>n;
//统计出每个数的个数
for(int i=0;i<n;i++)
{
cin>>a[i];
cnt[a[i]]++;
}
// j 是 i 的倍数,i 的倍数都加上 cnt[i]
for(int i=1;i<N;i++)
for(int j=i;j<N;j+=i)
s[j]+=cnt[i];
//自己不能算,故要减去一
for(int i=0;i<n;i++) cout<<s[a[i]]-1<<endl;
return 0;
}