【WOJ 1067】友好的地址对

【题目】

在这里插入图片描述


【分析】

先说一下暴力吧,对于范围内的每个数,都暴力算出因子之和,然后判断是否合法

但是这样做只有 40 40 分(毕竟是暴力)

既然对每个数分解比较慢,我们不妨换种思路,枚举每个因数,然后枚举它的倍数,它倍数的因子之和就加上它

因为因子最多有 h 2 \frac{h}{2} 个,枚举倍数的时候发现是调和级数,所以时间复杂度 O ( h l o g    h ) O(h*log\;h)

然后就完美地 A 掉这道题


【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 900005
using namespace std;
int ans[N];
int main()
{
	int l,r,i,j,k;
	scanf("%d%d",&l,&r);
	for(i=1;i<=r/2;++i)
	{
		k=(l+i-1)/i;
		for(j=max(k,2)*i;j<=r;j+=i)
		    ans[j]+=i;
	}
	for(i=l;i<=r;++i)
	    if(ans[i]>=l&&ans[i]<=r&&ans[ans[i]]==i&&i<ans[i])
	        printf("%d %d\n",i,ans[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/forever_dreams/article/details/83792211
今日推荐