杜教筛
杜教筛
前置:数论分块,莫比乌斯反演,狄利克雷卷积,欧拉函数。
对于数论函数 ,杜教筛能够在线性的时间复杂度内求得 的值。
只要我们能够构造出另一个数论函数 ,使得 能够以较快的时间复杂度求得,我们便能够使用杜教筛求得 的值。
我们设 ,我们则需要考虑构造出一个与 有关的式子。
对于 ,有,
注意此处我们将 使用狄利克雷卷积展开为 而非 的原因是为了构造出 。
枚举 ,转换一下式子得,
把 提出来,
根据 的定义,后面这块式子可以变为 ,
为了构造 ,我们把 时的式子拆开来
移项可得:
那么,对于 ,我们只要找到一个合适的数论函数 便能够求解 。
莫比乌斯函数
莫比乌斯函数,即 。
我们令 。
至此,便可用数论分块求得。
il int get_mu(int x) {
if (x <= 10000000) return mu[x];
if (res2[x]) return res2[x];
int res = 1;
for (ll l = 2,r; l <= x; l = r + 1 ) {
r = x / (x / l);
res -= (r - l + 1) * get_mu(x / l);
}
return res2[x] = res;
}
欧拉函数
欧拉函数,即 。
同样,令 。
至此,我们也能够使用数论分块解决。
il ll get_phi(ll x) {
if (x <= 10000000) return phi[x];
if (res1[x]) return res1[x];
ll res = 1ll * (1ll + x) * x / 2ll;
for (ll l = 2,r; l <= x; l = r + 1 ) {
r = x / (x / l);
res -= 1ll * (r - l + 1ll) * get_phi(x / l);
}
return res1[x] = res;
}
时间复杂度
不会证明。
因为使用的数论分块递归,时间复杂度是 。
但是如果我们提前预处理出前 的函数的值,则可以在 的时间复杂度内解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律