Patting Heads

题目链接

思路一

O(nlogn)

#include<bits/stdc++.h>
using namespace std;
int a[1000000],cnt[1000000],ans[1000000];
int main()
{
	int n,maxn=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		cnt[a[i]]++;//统计数字个数
		maxn=max(maxn,a[i]);
	}
	for(int i=1;i<=n;i++)
	{
		if(!ans[i])//如果这头牛的数字没有计算过
		{
			ans[i]=cnt[1];//1是所有数的因数
			if(a[i]!=1) ans[i]+=cnt[a[i]];//当前数字是1的话不要加重了
			for(int j=2;j<=sqrt(a[i]);j++)
			{
				if(a[i]%j==0) {
					ans[i]+=cnt[j];
					if(a[i]/j!=j) ans[i]+=cnt[a[i]/j];//不要加重的情况下每次加一对因数
				}
			}
		}
	}
	for(int i=1;i<=n;i++) cout<<ans[i]-1<<"
";//自己就不拍自己了
	return 0;
}

思路二

枚举每个数i,j=i,j+=i枚举i的倍数

orz

原文地址:https://www.cnblogs.com/qwq-/p/13696824.html