1. 程式人生 > 實用技巧 >題解 洛谷P2424 約數和

題解 洛谷P2424 約數和

題意讓我們求 \(\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;
}