bzoj 1607

统计一个数出现了几次。

然后枚举每个值,把它的倍数加上它的个数。

挺像埃拉筛法。

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

 

posted @ 2017-10-30 14:17  或是七一  阅读(93)  评论(0编辑  收藏  举报