一,86分解法
#include <bits/stdc++.h>
using namespace std;
long long n,ton[10000001],maxn;
struct nu
{
long long id,par;
} niu[10000001],tn[1000001];
bool cmp(nu a,nu b)
{
if(a.par == b.par) return a.id < b.id;
return a.par < b.par;
}
int main()
{
scanf("%lld",&n);
for(int i = 1; i <= n; i++)
{
niu[i].id = i;
scanf("%lld",&niu[i].par);
tn[i] = niu[i];
maxn = max(maxn,niu[i].par);
}
sort(niu + 1,niu + n + 1,cmp);
for(int i = 1; i < n; i++)
{
int t = niu[i].par,j;
if(niu[i].par == niu[i + 1].par) j = 1;
else j = 2;
while(1)
{
t *= j;
if(t > maxn) break;
ton[t]++;
t /= j;
j++;
}
}
for(int i = 1; i <= n; i++) printf("%lld\n",ton[tn[i].par]);
return 0;
}
二,AC解法
#include <bits/stdc++.h>
using namespace std;
int n,tong[1000010],in[1000010],ans[1000010],ma;
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&in[i]);
tong[in[i]]++;
ma = max(ma,in[i]);
}
for(int i = 1; i <= ma; i++)
if(tong[i] != 0)
for(int j = i; j <= ma; j += i)
ans[j] += tong[i];
for(int i = 1; i <= n; i++) printf("%d\n",ans[in[i]] - 1);
return 0;
}