bzoj 1607

暴力明显超时,很容易想到开个桶。

类似 Eratosthenes 筛法统计答案即可。

#include"cstdio"
#include"cctype"
int max(int a,int b)
{
    return a>b? a:b;
}
int read()
{
    int c,x=0; while(!isdigit(c=getchar()));
    while(x=x*10+c-'0',isdigit(c=getchar()));
    return x;
}
int a[1000001],w[1000001],f[1000001];
int main()
{
    int n=read(),m=0;
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
        w[a[i]]++;
        m=max(a[i],m);
    }
    for(int i=1;i<=m;i++) if(w[i])
        for(int j=i;j<=m;j+=i) f[j]+=w[i];
    for(int i=1;i<=n;i++) printf("%d\n",f[a[i]]-1);
    return 0;
}

 

posted @ 2018-02-26 14:48  312432424  阅读(64)  评论(0编辑  收藏  举报