【WOJ 1067】友好的地址對
阿新 • • 發佈:2019-02-07
【題目】
【分析】
先說一下暴力吧,對於範圍內的每個數,都暴力算出因子之和,然後判斷是否合法
但是這樣做只有 分(畢竟是暴力)
既然對每個數分解比較慢,我們不妨換種思路,列舉每個因數,然後列舉它的倍數,它倍數的因子之和就加上它
因為因子最多有 個,列舉倍數的時候發現是調和級數,所以時間複雜度
然後就完美地 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;
}