如果暴力,n^2,1e10,肯定不行

可以借助桶排序思想
for 每头牛
    cin 牛的编号
    每个编号的牛数num[编号]++

for 每个编号 1~1e6
    if 编号的牛数不为0
        for j;i*j<=1e6;j++ 遍历所有i的倍数
            该编号被拍数cnt[i的倍数i*j]++
            if i的倍数=i
                把自己拍自己的那次减掉cnt[i]--

时间复杂度分析
复杂度为

代码:
#include <bits/stdc++.h>

using namespace std;
const int N=1000004, NN=N+5;

int num[NN],cnt[NN],a[NN];
int n;

void work(){
	for(int i=1;i<=N;i++){//不要忘记了是= 
		if(!num[i]) continue;
		for(int j=1;j<=N/i;j++){
			 cnt[i*j]+=num[i];
			if(i*j==i) cnt[i*j]--;
		}
	}
}
int main(int argc, char** argv) {
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		num[a[i]]++;
	}
	work();
	for(int i=0;i<n;i++){
		printf("%d\n",cnt[a[i]]);
	}
	return 0;
}