題解 洛谷P2424 約數和
阿新 • • 發佈:2020-07-22
題意讓我們求 \(\sum_{i=l}^{r}f_i\),其中 \(f_i\) 表示 \(i\) 的約數和。
字首和的思想,不難發現 \(\sum_{i=l}^{r}f_i=\sum_{i=1}^{r}f_i-\sum_{i=1}^{l-1}f_i\)
令 \(G_x=\sum_{i=1}^{x}f_i\)。對於 \(x\) 中的每一個 \(d\),滿足 \(d\ \leq x\),有 \(\left\lfloor\dfrac{x}{d}\right\rfloor\) 個數包括因子 \(d\)。
故 \(G_x=\sum_{d=1}^{x} \left\lfloor\dfrac{x}{d}\right\rfloor \times d\)
複雜度為線性。
接下來考慮整除分塊優化。即對於相同的 \(\left\lfloor\dfrac{x}{d}\right\rfloor\) 分塊,求出 \(d\) 的取值範圍,等差數列求和即可。複雜度為根號。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll solve(ll x) { ll cnt=0,r=x; //for(int i=1;i<=x;i++) cnt+=i*(x/i); while(r) { ll d=x/r; ll l=x/(d+1)+1; cnt+=d*(l+r)*(r-l+1)/2; r=l-1; } return cnt; } int main() { int l,r; scanf("%d%d",&l,&r); printf("%lld\n",solve(r)-solve(l-1)); return 0; }