如果暴力,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; }