高维前缀和

前缀和

迪利克雷前缀和:给定 f(1),f(2),f(n),求 g(d)=xdf(x)d[1,n]

问题中的 g 就是就是 f 的迪利克雷前缀和,直接求是 O(nlnn) 的,但可以做到 O(nloglogn)

x=piαiy=piβi,那么 x 贡献到 y 当且仅当 i, αiβi。因此这就是一个质因数分解之后,指数的高位前缀和问题,先筛出 n 的所有质数,然后按位依次前缀和即可(每个质数是一”位“)

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

类似地,我们还有迪利克雷后缀和g(d)=dxf(x)

注意区别在于 dx 还是 xd。计算方法也是类似的。

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

差分

前缀差分:给定 g(1),g(2),g(n),已知 g(d)=xdf(x),求 f(x)x[1,n]

站在高维前缀和/差分的角度,我们只需要将前缀和的那一层循环反向,然后加号变减号即可。

for(int i = 1; i <= cnt; ++i)
for(int j = n / prime[i]; j >= 1; --j)
f[j * prime[i]] -= f[j];

后缀差分:给定 g(1),g(2),g(n),已知 g(d)=dxf(x),求 f(x)x[1,n]

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

给定一个正整数 n,求 1 ~ n 中有多少个数能被写成 ab (b2) 的形式。

n1018

这里只写莫比乌斯反演/后缀差分的做法

首先 a=1 时显然有且仅有 x=1 符合题意,接下来默认 a2

注意到 b 不会超过 59,所以可以枚举 b
对于一个 b,有 nb1a 符合题意。
但是我们不能把 nb1 之和当作答案,因为 a1b1=a2b2 的情况会导致算重。

思考一下会发现,同一个数 x 可能会有多种拆分方式,比如

64=43=82

此时我们希望规定一种方式,使得拆分是唯一的,就不会存在重复了。
所以可以让 a “最简”,也就是 a 不能表示为 pq 的形式,这时我们可以说 x=ab 是“幂次只能是 b 的数”

那么之前,我们计算的nb1ab 就是“幂次只能是 kb 的数 (kZ)”。这是因为没有限定 a 最简,所以 a 可以继续拆分。

于是我们设 f(b) 表示 “幂次只能是 b 的数的个数”,g(b) 表示“幂次只能是 kb 的数的个数”,则有下面的关系式:

g(b)=bxf(x)

我们的目的是求出 f,这种式子有两种处理方式

一:莫比乌斯反演

结论是

f(b)=bnμ(nb)g(n)

可以线性筛出 μ(1 ~ n),然后 O(nlnn)f

答案是 1+i=2nf(n)

二:高维前缀和

我们可以把一个数进行质因数分解,如 n=p1c1p2c2pkck
这样我们就可以认为 n 是一个有 k 个维度的向量 (c1,c2,,ck)

对于最初的式子

g(b)=bxf(x)

这里 bx 在多维视角下是什么意思呢?
不难发现,bx 表示 x 在每一维度下的数值都大于 c
那么这个式子所反映的关系就是:gf 在多维视角下的“后缀和”
所以 f 就是 g 的后缀差分

本文作者:hzy1

本文链接:https://www.cnblogs.com/hzy1/p/16803974.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hzy1  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-10-18 【题解】ABC233D - Restricted Permutation
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起