1. 程式人生 > >【WOJ 1067】友好的地址對

【WOJ 1067】友好的地址對

【題目】

在這裡插入圖片描述


【分析】

先說一下暴力吧,對於範圍內的每個數,都暴力算出因子之和,然後判斷是否合法

但是這樣做只有 4040 分(畢竟是暴力)

既然對每個數分解比較慢,我們不妨換種思路,列舉每個因數,然後列舉它的倍數,它倍數的因子之和就加上它

因為因子最多有 h2\frac{h}{2} 個,列舉倍數的時候發現是調和級數,所以時間複雜度 O(hlog  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; }