算法学习笔记(21):数论分块

数论分块

大部分内容来源于OI-WIKI

引理1: foralla,b,cZ,abc=abc

引理2: ni 的取值有 O(n)

引理 1 可以把一些分母搬上去, 转化成引理 2 的形式。 考虑引理 2 的式子的性质, 这启发我们计算 ni
可以快速统计。

有一个结论: 取值为 nl 的最大的 i 等于 nnl

所以我们就可以这么算 ni

int Sum(int x) {
	int l = 1, r = 0, res = 0;
	while(l <= x) {
		r = x / (x / l);
		res += (r - l + 1) * (x / l);
		l = r + 1;
	}
	return res;
}

拓展的, 当我们需要计算 fi×ni时:

可以把 res += (r - l + 1) * (x / l); 替换成 res += (f[r] - f[l - 1]) * (x / l);

再拓展地: 取值为 nl 的最大的 in1n1l

不严谨的证明:

引理4: ni=n1i+1

证明: n1i+1=n1+ii, 考虑 i1i<1, 所以易得前面的式子成立。

所以 ni 分的块和 n1i 分的块一致。

n维数论分块

我们考虑二维, 计算 a1i+a2i。 我们要快速计算某一段 (l,r) 的值, 也就是我们需要 l=1ra1i+a2i, 中的 a1i 都相同, a2i 都相同。

所以 r 端点取 min(a1a1l,a1a2l)

posted @   qqrj  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示