如果暴力,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;
} 
京公网安备 11010502036488号