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; }