题意:求ai在n个数中,ai可以整除的数有多少个,不包括ai自己。
分析:暴力写需要n^2的时间复杂度,此时想一下预处理每个数的倍数,约数和倍数是有关系的,把每个数的倍数都加上1.
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int s[N];
int cnt[N];
int a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
cnt[a[i]]++;
}
for(int i=1;i<N;i++)//这两重循环是O(nlogn)的
{
for(int j=i;j<N;j+=i)
{
s[j]+=cnt[i];
}
}
for(int i=1;i<=n;i++) cout<<s[a[i]]-1<<endl;
return 0;
}