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