前言
该从哪写起呢。
积性函数
定义不再赘述。
常见的 φ μ σ0 σ1都是积性函数。
其中σ0为约数个数和。 σ1为约数和。
μ的定义为
\mu(n)=\left\{
\begin{array}{**lr**}
1 & & n=1\\
(-1)^s & & n=p_1p_2...p_s \\
0 & & otherwise
\end{array}
\right.
在存在平方因子时μ为 0
Dirichlet 卷积
本篇中所有的卷积 ∗ 均为Dirichlet卷积。
定义为
h(n)=d∣n∑f(d)g(nd)
称 h 为 f 和 g 的卷积。
大概有一些显而易见的卷积恒等式,如
Idϵ=φ∗1=μ∗1
第二个其实是 μ 的定义式。
莫比乌斯反演
莫比乌斯反演指
fg=g∗1=f∗μ
不难发现,函数 1 也代表着将原函数做高维前缀和。
这与生成函数中的全 1 生成函数不谋而合。
证明根据定义。
g=g∗ϵ=g∗1∗μ=f∗μ
常用的形式为将 [gcd(x,y)=1] 改写为∑d∣gcd(i,j)μ(d)
证明根据定义。
[gcd(x,y)=1]=ϵ(gcd(x,y))=μ∗1
题目
求
i=1∑nj=1∑m[gcd(i,j)=p]
先整个简单的。
==i=1∑nj=1∑m[gcd(i,j)=1]i=1∑nj=1∑md∣gcd(i,j)∑μ(d)d=1∑min(n,m)μ(d)⌊dn⌋⌊dm⌋
除法分块。
那就在上面的经典题外面枚举一个 p
=p∑i=1∑nj=1∑m[gcd(i,j)=p]p∑d=1∑min(n,m)μ(d)⌊dpn⌋⌊dpm⌋
我们还是希望预处理那个前缀和。 换元一下
=t=1∑min(n,m)p∣t∑μ(pt)⌊tn⌋⌊tm⌋t=1∑min(n,m)f(t)⌊tn⌋⌊tm⌋
我们依然可以预处理 f ,复杂度为 埃筛的复杂度 O(nloglogn)
公约数的和
大概不是莫反的题。
i=1∑nj=i+1∑ngcd(i,j)
考虑求
===i=1∑nj=1∑ngcd(i,j)d=1∑ndi=1∑nj=1∑n[gcd(i,j)=d]d=1∑ndi=1∑dnj=1∑dn[gcd(i,j)=1]d=1∑nd(2i=1∑dnφ(i)−1)
你发现他们长得都一样。
再写一遍罢。
=i=1∏nj=1∏ngcd(i,j)lcm(i,j)i=1∏nj=1∏ngcd2(i,j)i×j
分子随便算。
考虑求
===i=1∏nj=1∏ngcd(i,j)d=1∏ndi=1∏nj=1∏n[gcd(i,j)=d]d=1∏nd∑i=1dn∑j=1dn[gcd(i,j)=1]d=1∏nd2∑i=1dnφ(i)−1
你发现他们好像确实一样。
求
i=1∑nj=1∑mσ0(i×j)
推
====f(n)=i=1∑nj=1∑mx∣i∑y∣j∑[gcd(x,y)=1]x=1∑ny=1∑m[gcd(x,y)=1]⌊xn⌋⌊ym⌋x=1∑ny=1∑m(d∣gcd(x,y)∑μ(d))⌊xn⌋⌊ym⌋d=1∑min(n,m)μ(d)x=1∑dny=1∑dm⌊xdn⌋⌊ydm⌋d=1∑min(n,m)μ(d)f(⌊dn⌋)f(⌊dm⌋)i=1∑n⌊in⌋=k=1∑nd(k)
你发现好像确确确实没啥区别。
对于最后一个式子考虑贡献。考虑每个数在n内的倍数会出现即可。
求
i=1∏nj=1∏mfgcd(i,j)
既
=i=1∏nj=1∏md∣i,d∣j∏f(d)[gcd(i,j)=d]d=1∏nf(d)∑i=1dn∑j=1dm[gcd(i,j)]=1
看指数很对味对吧。
=i=1∑dnj=1∑dm[gcd(i,j)=1]p=1∑dnμ(p)dpndpm
枚举 T=dp 就可以有
T=1∏n(k∣T∏f(k)μ(kT))TnTm
括号里面那个调和级数预处理前缀和即可。
p=1∑dnμ(p)dpndpm
求
i=1∑nj=1∑nlcm(ai,aj)
只需要对每个数字单独统计贡献即可。
即求
i=1∑nj=1∑nlcm(i,j)×ci×cj
其中 ci 即为 数字 i 出现的次数。
剩下的就是莫比乌斯反演非常基础的一些操作了。
=====i=1∑nj=1∑ngcd(i,j)i×j×ci×cji=1∑nj=1∑nd∣i,d∣j∑[gcd(i,j)=d]di×j×ci×cjd=1∑ni=1∑dnj=1∑dn[gcd(i,j)=1]i×j×d×cid×cjdd=1∑nk=1∑dni=1∑dknj=1∑dknμ(k)×k2×i×j×cidk×cjdkd=1∑ndkk=1∑dnμ(k)×k(i=1∑dkni×cidk)2T=1∑nT(k∣T∑μ(k)×k)(i=1∑Tni×ciT)2
Youwike の 怒 😡
求
i=1∑nj=1∑mgcd(i,j)k
其中 k 给定。
先推推试试嘛。
===d=1∑ndkj=1∑dnj=1∑dmf∣i,f∣j∑μ(f)d=1∑ndkf=1∑dnμ(f)⌊dfn⌋⌊dfm⌋T=1∑n⌊Tn⌋⌊Tm⌋(d∣T∑μ(dT)×dk)T=1∑n⌊Tn⌋⌊Tm⌋F(T)
可以体会其中枚举约数,枚举倍数的转化。
发现后面就是就是 μ∗idk。
由于这两个都是积性函数,因此 F 也是积性函数。
那么有
f(T)=i=1∏tf(pixi)f(pixi)=d∣pixi∑μ(dpixi)idk(d)
对于 μ 显然只有两种情况是没有平方因子的。
即
=f(pixi)=idk(pixi)−idk(pixi−1)(pik−1)×pik×(xi−1)
写出来发现
f(pixi)=f(pixi−1)∗idk(pi)
就能够线性筛了。
杜教筛
一种用来快速计算数论函数前缀和的方法。
即求
S(n)=i=1∑nf(i)
我们考虑引入一个新的积性函数g,考虑求 他们的卷积,求
===i=1∑n(f∗g)(i)i=1∑nd∣i∑f(d)g(di)d=1∑ng(d)i=1∑⌊dn⌋f(i)d=1∑ng(d)S(⌊dn⌋)
把需要用到的 S(n) 即 i=1 的情况提取出来,就能得到。
=g(1)S(n)=d=1∑ng(d)S(⌊dn⌋)−d=2∑ng(d)S(⌊dn⌋)i=1∑n(f∗g)(i)−d=2∑ng(d)S(⌊dn⌋)
需要找到一个 g 快速计算前面和后面。
后面记忆化递归,并且在线性筛能搜索到的范围内直接进行计算,复杂度就可以优化到O(n32)
对于常见的筛 μ 和 φ 的前缀和
对于 μ
我们选择 μ∗1=ϵ 其中可以快速地计算出 ϵ 的前缀和。
对于 φ
我们选择 φ∗1=id 其中可以快速的计算出 id 的前缀和。