题目大意:给出n个数,输出对于每个数x,其它的数有多少个是它的约数
题解:类似于筛素数。对于出现的每个数x,计算它对1–mx中所有其倍数的贡献。优化:把重复出现的数字一起筛
我的收获:合并相同项;筛法应用
#include <iostream>
#include <cstdio>
using namespace std;
const int M=100005;
int n,mx,a[M],cnt[M*10],ans[M*10];
void sieve()
{
for(int i=1;i<=mx;i++)
if(cnt[i]) for(int j=i;j<=mx;j+=i) ans[j]+=cnt[i];
}
void work()
{
sieve();
for(int i=1;i<=n;i++)
printf("%d\n",ans[a[i]]-1);//去掉自己
}
void init()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cnt[a[i]]++,mx=max(mx,a[i]);
}
}
int main()
{
init();
work();
return 0;
}