高维前缀和
前缀和
迪利克雷前缀和:给定 ,求 ,。
问题中的 就是就是 的迪利克雷前缀和,直接求是 的,但可以做到 。
设 ,,那么 贡献到 当且仅当 。因此这就是一个质因数分解之后,指数的高位前缀和问题,先筛出 的所有质数,然后按位依次前缀和即可(每个质数是一”位“)
for(int i = 1; i <= cnt; ++i) // cnt是质数个数 for(int j = 1; j * prime[i] <= n; ++j) f[j * prime[i]] += f[j]; // j * prime[i] 在第 i 位上的指数比 j 多 1
类似地,我们还有迪利克雷后缀和:。
注意区别在于 还是 。计算方法也是类似的。
for(int i = 1; i <= cnt; ++i) // cnt是质数个数 for(int j = n / prime[i]; j >= 1; --j) f[j] += f[j * prime[i]]; // j 在第 i 位上的指数比 j * prime[i] 少 1
差分
前缀差分:给定 ,已知 ,求 ,。
站在高维前缀和/差分的角度,我们只需要将前缀和的那一层循环反向,然后加号变减号即可。
for(int i = 1; i <= cnt; ++i) for(int j = n / prime[i]; j >= 1; --j) f[j * prime[i]] -= f[j];
后缀差分:给定 ,已知 ,求 ,。
for(int i = 1; i <= cnt; ++i) for(int j = 1; j * prime[i] <= n; ++j) f[j] -= f[j * prime[i]];
例题
ABC361F x=a^b
给定一个正整数 ,求 ~ 中有多少个数能被写成 的形式。
这里只写莫比乌斯反演/后缀差分的做法
首先 时显然有且仅有 符合题意,接下来默认
注意到 不会超过 ,所以可以枚举 。
对于一个 ,有 个 符合题意。
但是我们不能把 之和当作答案,因为 的情况会导致算重。
思考一下会发现,同一个数 可能会有多种拆分方式,比如
此时我们希望规定一种方式,使得拆分是唯一的,就不会存在重复了。
所以可以让 “最简”,也就是 不能表示为 的形式,这时我们可以说 是“幂次只能是 的数”
那么之前,我们计算的 个 就是“幂次只能是 的数”。这是因为没有限定 最简,所以 可以继续拆分。
于是我们设 表示 “幂次只能是 的数的个数”, 表示“幂次只能是 的数的个数”,则有下面的关系式:
我们的目的是求出 ,这种式子有两种处理方式
一:莫比乌斯反演
结论是
可以线性筛出 ~ ,然后 求
答案是
二:高维前缀和
我们可以把一个数进行质因数分解,如
这样我们就可以认为 是一个有 个维度的向量
对于最初的式子
这里 在多维视角下是什么意思呢?
不难发现, 表示 在每一维度下的数值都大于
那么这个式子所反映的关系就是: 是 在多维视角下的“后缀和”
所以 就是 的后缀差分
本文作者:hzy1
本文链接:https://www.cnblogs.com/hzy1/p/16803974.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2021-10-18 【题解】ABC233D - Restricted Permutation