【题目】
【分析】
先说一下暴力吧,对于范围内的每个数,都暴力算出因子之和,然后判断是否合法
但是这样做只有 分(毕竟是暴力)
既然对每个数分解比较慢,我们不妨换种思路,枚举每个因数,然后枚举它的倍数,它倍数的因子之和就加上它
因为因子最多有 个,枚举倍数的时候发现是调和级数,所以时间复杂度
然后就完美地 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;
}