1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

来源:互联网 发布:linux 重置网络配置 编辑:程序博客网 时间:2024/05/21 22:27

题目链接

题目大意:给出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;}
0 0
原创粉丝点击