→题目链接←
纯暴力搞显然是过不了的
我们记录下每个数的数量,然后算出这个数对其他的数的贡献
最后输出时要减一,因为它算贡献时是算了自己的
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#define inf 999999999
#define ll long long
using namespace std;
int n;
int num[1000010];
int a[100010];
int ans[1000010];
int Max=0;
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%d",&a[i]),num[a[i]]++,Max=max(Max,a[i]);
for(int i=1; i<=Max; i++){
if(!num[i])continue;
for(int j=i; j<=Max; j+=i){
ans[j]+=num[i];
}
}
for(int i=1; i<=n; i++){
printf("%d\n",ans[a[i]]-1);
}
return 0;
}