积性函数相关学习笔记
线性筛
也就是我。
首先在埃氏筛里面我们是对于每个素数筛一遍,因此复杂度是 \(O(n\log\log n)\) 的。
然后线性筛我们对所有数都筛一遍。注意到每个合数 \(n\) 都有最小质因数 \(x\),我们就让它在被 \(\frac{n}{x}\) 筛掉。
反向考虑,不难发现 \(n\) 能且只能乘一个不超过自身最小质因数的数去筛。
这个线性筛是非常优美的,我们可以发现每个数刚好只被筛了一次,所以复杂度显然为 \(O(n)\)。
每个数只被筛一次是一个非常优美的性质,我们显然可以用它来搞点事情。
整除分块
这个式子在我们知道快速求 \(f,g\) 任意一个的前缀和时可以 \(O(\sqrt n)\) 搞定。
不难发现 \(i=[1,\sqrt n]\) 的时候 \(\lfloor\frac{n}{i}\rfloor\) 只有 \(\sqrt n\) 个取值。
不难发现 \(i>\sqrt n\) 时 \(\lfloor\frac{n}{i}\rfloor<\sqrt n\),因此也只有 \(\sqrt n\) 个取值。
综上,\(i\) 和 \(\lfloor\frac{n}{i}\rfloor\) 都只有 \(\sqrt n\) 个取值,枚举一个取值的时候显然能得到另外一个取值的区间。
莫比乌斯函数
记 \(n\) 的莫比乌斯函数为 \(\mu(n)\)。
如果 \(n\) 有平方因子,则 \(\mu(n)=0\)。
如果 \(n\) 没有平方因子,设 \(n\) 有 \(t\) 个质因子,则 \(\mu(n)=(-1)^t\)。
我们显然可以使用线性筛筛 \(\mu(n)\),也可以在 \(O(\sqrt n)\) 的复杂度内计算单个 \(\mu(n)\)。
欧拉函数
记 \(n\) 的欧拉函数为 \(\varphi(n)\)。
\(\varphi(n)\) 等于小于等于 \(n\) 且与 \(n\) 互质的整数个数。
记 \(n\) 的唯一分解为 \(\prod p_i^{k_i}\),则 \(\varphi(n)=n\prod(1-p_i)\)。
我们显然可以使用线性筛筛 \(\varphi(n)\),也可以在 \(O(\sqrt n)\) 的复杂度内计算单个 \(\varphi(n)\)。
例1 P2398
展开
$$Ans=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=d]$$ $$Ans=\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}[\gcd(i,j)=1]$$ $$F(n)=\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=1]$$ $$F(n)=2\sum_{i=1}^n\sum_{j=1}^{i}[\gcd(i,j)=1]-1$$ $$F(n)=2\sum_{i=1}^n\varphi(i)-1$$ $$Ans=\sum_{d=1}^ndF(\lfloor\frac{n}{d}\rfloor)$$ 于是预处理 $O(n)$ 可以做到 $O(1)$ 算 $F(n)$。一个性质
显然我们把这个东西单独拎出来肯定是有用的,因此记住它。
数论函数
定义域 \(=\mathbb{Z}^+\),值域 \(\in\mathbb{C}\) 的函数就是数论函数。
积性函数
积性函数都是数论函数
对于任意 \(\gcd(n,m)=1\) 都有 \(f(nm)=f(n)f(m)\) 的数论函数称为积性函数。
常见的积性函数有以下几种:
- \(\varphi(n)\),欧拉函数。
- \(\mu(n)\),莫比乌斯函数。
- \(d(n)\),因数个数函数。
- \(\sigma(n)\),因数和函数。
积性函数基本都可以通过线性筛来 \(O(n)\) 预处理。
对于任意正整数 \(n,m\) 都有 \(f(nm)=f(n)f(m)\) 的数论函数称为完全积性函数。
常见的完全积性函数有以下几种:
- \(\epsilon(n)\),元函数,\(\epsilon(n)=[n=1]\)。
- \(I(n)\),恒等函数,\(I(n)=1\)。
- \(id(n)\),单位函数,\(id(n)=n\)。
狄利克雷卷积
和生成函数一样,两个数论函数也可以卷积。
于是有一些很显然的性质。
- \(f*g=g*f\),交换律。
- \((f*g)*h=f*(g*h)\),结合律。
- \((f+g)*h=f*h+g*h\),分配律。
- \(f*\epsilon=f\)。
- \(\mu*I=\epsilon\),也就是上面的“一个性质”。
- \(\mu*id=\varphi\)。
- \(\varphi*I=id\)。
莫比乌斯反演
这是第一个难点。
先说结论。
为什么呢?
然后我们转置反演矩阵(此部分待补充)可以得到另一种形式。
例2 P3455
展开
记 $n=\frac{a}{d}$,$m=\frac{b}{d}$。 $$Ans=\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=1]$$ $$Ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|\gcd(i,j)}\mu(d)$$ $$Ans=\sum_{d=1}^{n}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor$$例3 P6810
展开
$$Ans=\sum_{t=1}^{\min(n,m)}d(t)\sum_{i=1}^{\frac{n}{t}}\sum_{j=1}^{\frac{m}{t}}d(it)d(jt)[\gcd(i,j)=1]$$ $$Ans=\sum_{t=1}^{\min(n,m)}d(t)\sum_{i=1}^{\frac{n}{t}}\sum_{j=1}^{\frac{m}{t}}d(it)d(jt)\sum_{k|\gcd(i,j)}\mu(k)$$ $$Ans=\sum_{t=1}^{\min(n,m)}d(t)\sum_{k}\sum_{i=1}^{\frac{n}{tk}}\sum_{j=1}^{\frac{m}{tk}}d(itk)d(jtk)$$ $$Ans=\sum_{T=1}^{\min(n,m)}\sum_{t|T}d(t)\mu(\frac{T}{t})\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{m}{T}}d(iT)d(jT)$$ $$Ans=\sum_{T=1}^{\min(n,m)}\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{m}{T}}d(iT)d(jT)$$例4
有多组询问。
展开
$$Ans=\sum_{d\in P}\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=d]$$ $$f(d)=\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=d]$$ $$F(d)=\sum_{i=1}^{n}\sum_{j=1}^{m}[d|\gcd(i,j)]=\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor$$ $$F(n)=\sum_{n|d}f(d)$$ $$f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)$$ $$Ans=\sum_{d\in P}\sum_{d|t}\mu(\frac{t}{d})\lfloor\frac{n}{t}\rfloor\lfloor\frac{m}{t}\rfloor$$ $$Ans=\sum_{t=1}^n\lfloor\frac{n}{t}\rfloor\lfloor\frac{m}{t}\rfloor\sum_{d|t,d\in P}\mu(\frac{t}{d})$$例5
有多组询问。
展开
$$Ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)}$$ $$Ans=\sum_{d=1}^n\frac{1}{d}\sum_{i=1}^{n}\sum_{j=1}^{m}ij[\gcd(i,j)=d]$$ $$Ans=\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}ij[\gcd(i,j)=1]$$ $$F(n,m)=\sum_{i=1}^n\sum_{j=1}^mij[\gcd(i,j)=1]$$ $$F(n,m)=\sum_{i=1}^n\sum_{j=1}^mij\sum_{d|\gcd(i,j)}\mu(d)$$ $$F(n,m)=\sum_{d=1}^{\min(n,m)}\mu(d)d^2\sum_{i=1}^{\frac{n}{d}}i\sum_{i=1}^{\frac{m}{d}}j$$ $$F(n,m)=\sum_{d=1}^{\min(n,m)}\mu(d)d^2S(\frac{n}{d})S(\frac{m}{d})$$ $$Ans=\sum_{d=1}^ndF(\frac{n}{d},\frac{m}{d})$$ $$Ans=\sum_{t=1}^nt\sum_{d=1}^{\min(\frac{n}{t},\frac{m}{t})}\mu(d)d^2S(\frac{n}{dt})S(\frac{m}{dt})$$ $$Ans=\sum_{T=1}^{\min(n,m)}S(\frac{n}{T})S(\frac{m}{T})T\sum_{d|T}\mu(d)d$$ $f(n)=\sum\limits_{d|n}\mu(d)d$ 是个积性函数,因此我们可以线性筛。例6 AT5200
展开
$$Ans=\sum_{d=1}\frac{1}{d}\sum_{i=1}\sum_{j=1}c_{i}c_{j}[\gcd(i,j)=d]$$ $$Ans=\sum_{d=1}\frac{1}{d}\sum_{i=1}\sum_{j=1}c_{id}c_{jd}[\gcd(i,j)=1]$$ $$F(k)=\sum_{i=1}\sum_{j=1}c_{ik}c_{jk}[\gcd(i,j)=1]$$ $$F(k)=\sum_{i=1}\sum_{j=1}c_{ik}c_{jk}\sum_{d|\gcd(i,j)}\mu(d)$$ $$F(k)=\sum_{d=1}\mu(d)(\sum_{i=1}c_{idk})^2$$例7 P3312
有多组询问。
展开
$$\sigma'(d)=\begin{cases}\sigma(d)&(d\leq a)\\ 0&(d>a)\end{cases}$$ $$\sum_{d=1}\sigma'(d)\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d]$$ $$\sum_{d=1}\sigma'(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}\sum_{t|\gcd(i,j)}\mu(t)$$ $$\sum_{t=1}^{\min(n,m)}\mu(t)\sum_{d=1}\sigma'(d)\sum_{i=1}^{\frac{n}{dt}}\sum_{j=1}^{\frac{m}{dt}}1$$ $$\sum_{T=1}^{\min(n,m)}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{t|T}\mu(t)\sigma'(\frac{T}{t})$$ 大力离线询问维护 $\sum\limits_{t|T}\mu(t)\sigma'(\frac{T}{t})$ 就可以做到 $O(n\log^2n+q\sqrt n\log n)$ 了。例8 P3704
有多组询问。
展开
$$F(x)=\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x]$$ $$Ans=\prod_{i=1}^{\min(n,m)}f_{i}^{F(i)}$$ $$F(x)=\sum_{i=1}^{\min(\frac{n}{x},\frac{m}{x})}\mu(i)\lfloor\frac{n}{ix}\rfloor\lfloor\frac{m}{ix}\rfloor$$ $$Ans=\prod_{T=1}^{\min(n,m)}\prod_{i|T}f_i^{\mu(\frac{T}{i})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}$$ $$Ans=\prod_{T=1}^{\min(n,m)}(\prod_{i|T}f_i^{\mu(\frac{T}{i})})^{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}$$例9 P6156
展开
$$\sum_{d=1}d^{k+1}\mu(d)^2\sum_{i=1}^\frac{n}{d}\sum_{j=1}^\frac{n}{d}(i+j)^k[\gcd(i,j)=1]$$ $$\sum_{d=1}d^{k+1}\mu(d)^2\sum_{i=1}^\frac{n}{d}\sum_{j=1}^\frac{n}{d}(i+j)^k\sum_{t|\gcd(i,j)}\mu(t)$$ $$\sum_{d=1}d^{k+1}\mu(d)^2\sum_{t=1}\mu(t)t^k\sum_{i=1}^\frac{n}{dt}\sum_{j=1}^\frac{n}{dt}(i+j)^k$$ $$\sum_{T=1}T^k\sum_{d|T}d\mu(d)^2\mu(\frac{T}{d})\sum_{i=1}^\frac{n}{T}\sum_{j=1}^\frac{n}{T}(i+j)^k$$ $\sum\limits_{d|T}d\mu(d)^2\mu(\frac{T}{d})$ 是个积性函数,显然可以线性筛。 $T^k$ 是个积性函数,显然也可以线性筛。 $$\sum_{i=1}^{n}\sum_{j=1}^{n}(i+j)^k-\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}(i+j)^k=2\sum_{i=1}^{n-1}(i+n)^k+(2n)^k$$ 因此也可以递推,这道题就做完了。杜教筛
对于一些积性函数 \(f(x)\),我们可以使用杜教筛在 \(O(n^{\frac{2}{3}})\) 的复杂度内求前缀和。
如果我们能在 \(O(1)\) 的时间内求出 \(h(i)\) 的前缀和,并处理出 \(n^{\frac{2}{3}}\) 以内的 \(F(i)\),整体算法复杂度为 \(O(n^{\frac{2}{3}})\)。
杜教筛使用的唯一前提就是你能找到一个很优美的 \(g\)。
min_25筛
一些记号
对于所有 \(f(p)\) 可以用一个多项式表示,且 \(f(p^k)\) 可以快速计算的积性函数 \(f(x)\),我们可以使用min_25筛在 \(O(\frac{n^{\frac{3}{4}}}{\log n}+n^{1-\epsilon})\) 的复杂度内求在 \(\frac{n}{d}\) 处的前缀和。
由于我太菜了不会证复杂度,上面那坨东西可以大概理解为能跑 \(10^{11}\)?
首先,我们新定义一个完全积性函数 \(g(x)\),其在 \(x\in P\) 处值为 \(g(x)\)。
下文中,我们记 \(P_j\) 为第 \(j\) 个质数,\(\min(n)\) 为一个数的最小质因数。不难注意到 \(\min(n)\leq\sqrt n\)。
第一步
显然 \(\sum\limits_{i=1}^n[i\in P]f(i)=G_{n,k}\),其中 \(k\) 为 \(\sqrt n\) 内质数个数。
第二步
显然 \(F_{n,0}\) 即为所求。