数论分块

发布时间 2023-10-26 21:40:55作者: ricky_lin

一、应用情景

\(\sum\limits_{i = 1}^{n} g(i)\lfloor\frac n i\rfloor,n\leq 10 ^{12}\)

二、常见结合

  • 莫比乌斯反演
  • ……

三、算法原理&代码实现

实际上,\(~\lfloor \frac n i\rfloor~\)的取值其实最多只有\(~2\times\sqrt n~\) 种:

对于\(~i\in [1,\sqrt n]~\):只有\(~\sqrt n~\)

对于\(~i\in[\sqrt n,n]~\)\(~\lfloor \frac n i\rfloor~\)只有\(\sqrt n\)

我们对于每一种取值,算出该种取值区间的 \(g(i)\) 的和,即可求出答案

通常地,为了求解 \(g(i)\) 我们通常会预处理前缀和,在数论分块的时候就可以 \(O(1)\) 求解了

时间复杂度:\(~O(\sqrt n)~\)

code:

void solve(){
	scanf("%lld",&n);
	ll ans = 0;
	for(int i = 1,j,num; i <= n; i = j + 1){
		num = n / i;
		j = n / num;
		ans += 1ll * num * (j - i + 1);
	}
	printf("%lld\n",ans);
	return;
}

五、练习

UVA11526 H(n)

板子,只不过你需要注意当\(~n = 2147482647~\)时,\(~for~\)循环的\(~i~\)有可能溢出,然后导致\(~RE~/~TLE~\) 帖子

CQOI2007 余数求和

求解:\(~G(n,k)=\sum\limits_{i=1}^nk~mod~i~\)

solution:

\(~G(n,k)=\sum\limits_{i=1}^nk~mod~i~\)

\(~G(n,k)=\sum\limits_{i=1}^n(k - i \times \lfloor \frac k i\rfloor)~\)

\(~G(n,k)=n\times k - \sum\limits_{i=1}^ni \times \lfloor \frac k i\rfloor~\)

还是数论分块,只不过将(j - i + 1)改为(i + j) * (j - i + 1) / 2即可