狄利克雷卷积相关
一、数论函数
数论函数是指定义在整数集上,陪域是实数或复数的函数。 数论函数又称为算术函数。
像σ(n)\sigma(n)σ(n),表示nnn的约数之和的函数,就是一个数论函数;
像id(n)=nid(n)=nid(n)=n,表示nnn本身,也是数论函数。
它们的定义域都是整数。
二、积性函数
1、积性函数的定义
积性函数是指满足下列条件的一类数论函数。设函数为fff, 设a,ba,ba,b是任意两个互质的整数。
如果满足f(a)×f(b)=f(a×b)f(a) \times f(b) = f(a\times b)f(a)×f(b)=f(a×b), 则函数fff为积性函数。
如果不要求a,ba,ba,b互质,仍然满足f(a)×f(b)=f(a×b)f(a) \times f(b) = f(a \times b)f(a)×f(b)=f(a×b),则称fff为完全积性函数。
许多函数都是积性函数。
2、常见的积性函数
常见的积性函数有:
单位函数:ϵ(n)=[n=1]\epsilon(n) = [n = 1]ϵ(n)=[n=1] (方括号是艾佛森表示法,类似于一个条件表达式,当方括号中的条件成立时返回111;否则返回000)
常数函数:I(n)=1I(n) = 1I(n)=1
恒等函数: Id(n)=nId(n) = nId(n)=n
幂函数: Idk(n)=nkId_k(n) = n^kIdk(n)=nk
恒等函数可以看做k=1k=1k=1的幂函数,常数函数可以看做k=0k=0k=0的幂函数。
约数函数:σ(n)=∑d∣nd\sigma(n) = \sum_{d|n}dσ(n)=∑d∣nd
约数个数函数:σ0(n)=∑d∣nd0\sigma_0(n)=\sum_{d|n}d^0σ0(n)=∑d∣nd0
欧拉函数:ϕ(n)=∑a≤n[(a,n)=1]\phi(n)=\sum_{a\leq n}[(a,n)=1]ϕ(n)=∑a≤n[(a,n)=1]
莫比乌斯函数: μ(n)={1n=1(−1)kn=p1…pk0p2∣n\mu(n) = \begin{cases} 1 &n=1 \\ (-1)^k &n=p_1\dots p_k \\0 &p^2|n \end{cases}μ(n)=⎩⎨⎧1(−1)k0n=1n=p1…pkp2∣n
其中I(n),Id(n),Idk(n)I(n), Id(n), Id_k(n)I(n),Id(n),Idk(n)为完全积性函数。
3、证明欧拉函数为积性函数
如何证明欧拉函数是积性函数?即设a,ba,ba,b互质,ϕ(ab)=ϕ(a)∗ϕ(b)\phi(ab) = \phi(a) *\phi(b)ϕ(ab)=ϕ(a)∗ϕ(b)
证明:设xxx与ababab互质,且x<abx \lt abx<ab。则xxx一定同时与aaa和bbb互质,设p=x%a,q=x%bp = x \% a, q = x \%bp=x%a,q=x%b,显然有p∈Za∗,q∈Zb∗p \in Z_a^*,q \in Z_b^*p∈Za∗,q∈Zb∗,其中Za∗,Zb∗Z_a^*,Z_b^*Za∗,Zb∗分别表示a,ba,ba,b的简化剩余系。
{x≡p(moda)x≡q(modb)
\begin{cases}
x \equiv p \pmod{a} \\
x \equiv q \pmod {b}
\end{cases}{x≡p(moda)x≡q(modb)
则以上方程的解xxx的个数就是ϕ(ab)\phi(ab)ϕ(ab)。对于任意的p∈Za∗,q∈Zb∗p \in Z_a^*, q \in Z_b^*p∈Za∗,q∈Zb∗,根据中国剩余定理,在[0,ab−1][0, ab-1][0,ab−1]内都存在一组解。而满足条件的p,qp,qp,q对刚好有ϕ(a)×ϕ(b)\phi(a) \times \phi(b)ϕ(a)×ϕ(b),所以ϕ(ab)=ϕ(a)×ϕ(b)\phi(ab) = \phi(a) \times \phi(b)ϕ(ab)=ϕ(a)×ϕ(b)。
得证。
4、积性函数的性质
(1)、积性函数的乘积仍然是积性函数。
简单证明一下:
设H,GH,GH,G为积性函数,F=H×GF=H \times GF=H×G,a,ba,ba,b互质。
F(a×b)=H(a×b)×G(a×b)=H(a)×H(b)×G(a)×G(b)=(H(a)×G(a))×(H(b)×G(b))=F(a)×F(b)F(a\times b)=H(a \times b) \times G(a \times b)=H(a) \times H(b) \times G(a) \times G(b) = (H(a) \times G(a)) \times (H(b) \times G(b)) = F(a) \times F(b)F(a×b)=H(a×b)×G(a×b)=H(a)×H(b)×G(a)×G(b)=(H(a)×G(a))×(H(b)×G(b))=F(a)×F(b)
(2)、积性函数的狄利克雷卷积仍然是积性函数。
简单证明一下:
设H,GH,GH,G为积性函数,F=H×G,a,bF=H \times G, a, bF=H×G,a,b为互质的正整数。
F(a×b)=∑d∣(ab)H(d)×G(abd)=∑(d1∣a,d2∣b)H(d1)H(d2)G(a/d1)G(b/d2)=∑d1∣aH(d1)G(a/d1)∑d2∣bH(d2)G(b/d2)=F(a)×F(b)\begin{aligned} F(a \times b) &= \sum_{d|(ab)}H(d)\times G(\frac{ab}{d}) = \sum_{(d_1|a,d_2|b)} H(d_1)H(d_2)G(a/d_1)G(b/d_2) \\ &=\sum_{d_1|a}H(d_1)G(a/d_1)\sum_{d_2|b}H(d_2)G(b/d_2)=F(a)\times F(b) \end{aligned}F(a×b)=d∣(ab)∑H(d)×G(dab)=(d1∣a,d2∣b)∑H(d1)H(d2)G(a/d1)G(b/d2)=d1∣a∑H(d1)G(a/d1)d2∣b∑H(d2)G(b/d2)=F(a)×F(b)
积性函数都可以采用欧拉筛求值。
f(n)=f(p1a1p2a2…pkak)=f(p1a1)∗f(p2a2)…f(pkak)f(n) = f(p_1^{a_1}p_2^{a_2} \dots p_k^{a_k})=f(p_1^{a_1})*f(p_2^{a_2}) \dots f(p_k^{a_k})f(n)=f(p1a1p2a2…pkak)=f(p1a1)∗f(p2a2)…f(pkak)
其中p1,p2,…,pkp_1,p_2,\dots,p_kp1,p2,…,pk表示nnn的不同质因子。
三、莫比乌斯反演
1. 莫比乌斯函数
μ(n)={1n=1(−1)kn=p1…pk0p2∣n\mu(n) = \begin{cases} 1 &n=1 \\ (-1)^k &n=p_1\dots p_k \\0 &p^2|n \end{cases}μ(n)=⎩⎨⎧1(−1)k0n=1n=p1…pkp2∣n
p2∣np^2|np2∣n表示nnn存在一个平方因子。
莫比乌斯函数的性质
∑d∣nμ(d)=[n=1] \begin{aligned} \sum_{d|n}\mu(d) = [n = 1] \end{aligned} d∣n∑μ(d)=[n=1]
证明:
当d=1d=1d=1时,μ(1)=1\mu(1)=1μ(1)=1;
其他情况下,只有当ddd的质因子都只出现一次,假设此时ddd的质因子种类为kkk, 则μ(d)=(−1)k\mu(d)=(-1)^kμ(d)=(−1)k。
ddd中出现的质因子,必定是nnn的质因子,所以,问题变成从nnn的所有质因子中选择若干,选奇数个则贡献−1-1−1, 选偶数个则贡献111.
设nnn中一共有mmm类质因子,∑d∣nμ(d)=∑(−1)j(mj)=(1−1)m\begin{aligned} \sum_{d|n}\mu(d) = \sum(-1)^j\binom{m}{j}=(1-1)^m \end{aligned}d∣n∑μ(d)=∑(−1)j(jm)=(1−1)m
以上是根据二项式定理: (x+y)n=∑i=0n(ni)xiyn−i\begin{aligned} (x+y)^n=\sum\limits_{i=0}^n\binom{n}{i}x^iy^{n-i} \end{aligned}(x+y)n=i=0∑n(in)xiyn−i
当m>0m>0m>0时, ∑d∣nμ(d)=0\sum\limits_{d|n}\mu(d) = 0d∣n∑μ(d)=0;
当m=0m=0m=0时, ∑d∣nμ(d)=1\sum\limits_{d|n}\mu(d) = 1d∣n∑μ(d)=1。
2. 莫比乌斯反演
(1). 公式1:
若F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=∑d∣nf(d), 则有f(n)=∑d∣nμ(d)F(nd)f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})f(n)=∑d∣nμ(d)F(dn)
证明:
f(n)=∑d∣nμ(d)F(n/d)=∑d∣nμ(d)∑p∣(n/d)f(p)=∑p∣nf(p)∑d∣(n/p)μ(d)\begin{aligned}f(n)=\sum_{d|n}\mu(d)F(n/d)=\sum_{d|n}\mu(d)\sum_{p|(n/d)}f(p)=\sum_{p|n}f(p)\sum_{d|(n/p)}\mu(d)\end{aligned}f(n)=d∣n∑μ(d)F(n/d)=d∣n∑μ(d)p∣(n/d)∑f(p)=p∣n∑f(p)d∣(n/p)∑μ(d)
根据莫比乌斯函数的性质,可知只有当n/p=1n/p=1n/p=1时,∑d∣(n/p)μ(d)=1\sum_{d|(n/p)}\mu(d)=1∑d∣(n/p)μ(d)=1,其他情况下都为000.
所以,
∑p∣nf(p)∑d∣(n/p)μ(d)=f(n)\begin{aligned}\sum_{p|n}f(p) \sum_{d|(n/p)}\mu(d) = f(n) \end{aligned}p∣n∑f(p)d∣(n/p)∑μ(d)=f(n)
得证!
(2). 公式2:
若F(n)=∑n∣df(d)F(n) = \sum_{n|d}f(d)F(n)=∑n∣df(d), 则有f(n)=∑n∣dμ(d/n)F(d)f(n)=\sum_{n|d}\mu(d/n)F(d)f(n)=∑n∣dμ(d/n)F(d)
证明:
f(n)=∑n∣dμ(d/n)F(d)=∑n∣dμ(d/n)∑d∣pf(p)=∑n∣pf(p)∑d∣(p/n)μ(d)=f(n)\begin{aligned} f(n)=\sum_{n|d}\mu(d/n)F(d)=\sum_{n|d}\mu(d/n)\sum_{d|p}f(p)= \sum_{n|p}f(p)\sum_{d|(p/n)}\mu(d) = f(n)\end{aligned}f(n)=n∣d∑μ(d/n)F(d)=n∣d∑μ(d/n)d∣p∑f(p)=n∣p∑f(p)d∣(p/n)∑μ(d)=f(n)
3. 一些有趣的性质:
-
当n>1n>1n>1时, ∑i<n(i×[gcd(i,n)=1])=nϕ(n)2\sum\limits_{i \lt n} (i \times [gcd(i,n)=1]) = \frac{n \phi(n)}{2}i<n∑(i×[gcd(i,n)=1])=2nϕ(n)
解释:当n>1n>1n>1时,nnn的简化剩余系中,元素都是成对出现的,每一对元素的和为nnn. -
ϕ(n)=∑i∣dμ(i)∗(n/i)\phi(n)=\sum_{i|d}\mu(i)*(n/i)ϕ(n)=∑i∣dμ(i)∗(n/i)
解释:根据容斥原理,与nnn互质的数,其个数为:(与nnn的公约数为111的数的个数)-(与nnn的公约数由一类质因子组成的数的个数)+(与nnn的公约数由两类质因子组成的数的个数)- (与nnn的公约数由三类质因子组成的数的个数)+ …\dots… - (与nnn的公约数由奇数类质因子组成的数的个数) + (与nnn的公约数由偶数类质因子组成的数的个数)。 -
n=∑i∣dϕ(i)n= \sum_{i|d}\phi(i)n=∑i∣dϕ(i)
解释:
小于等于nnn的整数共有nnn个,可以分类统计:与nnn的最大公约数为iii的数有ϕ(n/i)\phi(n/i)ϕ(n/i)个。于是有n=∑i∣dϕ(n/i)=∑i∣dϕ(i)n = \sum_{i |d} \phi(n/i) = \sum_{i|d} \phi(i)n=∑i∣dϕ(n/i)=∑i∣dϕ(i) -
扩展欧拉定理: ab%p=a(b%ϕ(p)+ϕ(p))%pa^b\%p=a^{(b\%\phi(p)+\phi(p))}\%pab%p=a(b%ϕ(p)+ϕ(p))%p ,此处不要求a,pa,pa,p互质。
解释:参考另一篇待写的博客。
4. 莫比乌斯反演的应用
(1). 例1:证明下式成立
∑d∣nμ(d)(nd)=ϕ(n)\begin{aligned} \sum\limits_{d|n}\mu(d)(\frac{n}{d})=\phi(n) \end{aligned}d∣n∑μ(d)(dn)=ϕ(n)
证明:
∵n=∑d∣nϕ(n/d)=∑d∣nϕ(d)\because n=\sum_{d|n}\phi(n/d) =\sum_{d|n}\phi(d)∵n=∑d∣nϕ(n/d)=∑d∣nϕ(d),
设F(n)=nF(n)=nF(n)=n, f(n)=ϕ(d)f(n)=\phi(d)f(n)=ϕ(d),
则上式为F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=∑d∣nf(d), 利用莫比乌斯反演公式1, 可得:
f(n)=∑d∣nμ(d)F(n/d)\begin{aligned} f(n)=\sum_{d|n}\mu(d)F(n/d) \end{aligned}f(n)=d∣n∑μ(d)F(n/d)
即:
ϕ(n)=∑d∣nμ(d)(n/d)\begin{aligned} \phi(n)=\sum_{d|n}\mu(d)(n/d) \end{aligned}ϕ(n)=d∣n∑μ(d)(n/d)
(2). BZOJ2301 problem B
题目描述
对于给出的n个询问,每次求有多少个数对(x,y)(x,y)(x,y),满足a≤x≤ba≤x≤ba≤x≤b,c≤y≤dc≤y≤dc≤y≤d,且gcd(x,y)=kgcd(x,y) = kgcd(x,y)=k,gcd(x,y)gcd(x,y)gcd(x,y)函数为x和y的最大公约数。
输入格式
第一行一个整数nnn,接下来nnn行每行五个整数,分别表示a、b、c、d、ka、b、c、d、ka、b、c、d、k
输出格式
共nnn行,每行一个整数表示满足要求的数对(x,y)(x,y)(x,y)的个数
数据规模
n≤50000,1≤a≤b≤50000,1≤c≤d≤50000n\leq 50000, 1 \leq a \leq b \leq 50000, 1 \leq c \leq d \leq 50000n≤50000,1≤a≤b≤50000,1≤c≤d≤50000
分析
设f(k)f(k)f(k)为∑x=ab∑y=cd[gcd(x,y)=k]\sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)=k]∑x=ab∑y=cd[gcd(x,y)=k],F(k)F(k)F(k)为∑x=ab∑y=cd[k∣gcd(x,y)]\sum_{x=a}^b\sum_{y=c}^d[k|gcd(x,y)]∑x=ab∑y=cd[k∣gcd(x,y)],
则有F(k)=∑k∣nf(n)F(k)=\sum_{k|n}f(n)F(k)=∑k∣nf(n)
而F(k)F(k)F(k)是很好求的,它为:(⌊b/k⌋−⌊(a−1)/k⌋)∗(⌊d/k⌋−⌊(c−1)/k⌋)(\lfloor b/k \rfloor - \lfloor (a-1)/k \rfloor)*(\lfloor d/k \rfloor - \lfloor (c-1)/k\rfloor)(⌊b/k⌋−⌊(a−1)/k⌋)∗(⌊d/k⌋−⌊(c−1)/k⌋).
应用莫比乌斯反演:
可知
f(k)=∑k∣nμ(n/k)∗F(n)=∑k∣nμ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)\begin{aligned} f(k) = \sum_{k|n} \mu(n/k)*F(n) = \sum_{k|n}\mu(n/k)*(\lfloor b/n \rfloor - \lfloor (a-1)/n \rfloor)*(\lfloor d/n \rfloor - \lfloor (c-1)/n\rfloor) \end{aligned}f(k)=k∣n∑μ(n/k)∗F(n)=k∣n∑μ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)
注意a,b,c,da, b, c, da,b,c,d为常数,⌊a/n⌋\lfloor a/n \rfloor⌊a/n⌋随着nnn增加而变化,但⌊a/n⌋\lfloor a/n \rfloor⌊a/n⌋的取值最多只有2a2\sqrt{a}2a个。
为什么呢?
如下图所示,为f(n)=1/n(n>0)f(n) = 1/n (n>0)f(n)=1/n(n>0)的曲线图像,它是一条以y=xy=xy=x对称的曲线。这很好理解。
若(x,y)(x,y)(x,y)在曲线上,则(y,x)(y,x)(y,x)也必在曲线上。
对f(x)=a/xf(x)=a/xf(x)=a/x而言,曲线对称的中心点在(a,a)(\sqrt{a},\sqrt{a})(a,a)处,在中心点左边,xxx最多a\sqrt{a}a个整数取值,因为对称,所以在(a,a)(\sqrt{a},\sqrt{a})(a,a)的右边,yyy值最多a\sqrt{a}a个整数值。
所以,⌊a/n⌋\lfloor a/n \rfloor⌊a/n⌋最多有2a2\sqrt{a}2a个整数值。

于是,对于
f(k)=∑k∣nμ(n/k)∗F(n)=∑k∣nμ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)\begin{aligned} f(k) = \sum_{k|n} \mu(n/k)*F(n) = \sum_{k|n}\mu(n/k)*(\lfloor b/n \rfloor - \lfloor (a-1)/n \rfloor)*(\lfloor d/n \rfloor - \lfloor (c-1)/n\rfloor) \end{aligned}f(k)=k∣n∑μ(n/k)∗F(n)=k∣n∑μ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)
我们只需要枚举⌊b/n⌋\lfloor{b/n} \rfloor⌊b/n⌋, ⌊(a−1)/n⌋\lfloor (a-1)/n \rfloor⌊(a−1)/n⌋, ⌊d/n⌋\lfloor d/n \rfloor⌊d/n⌋, ⌊(c−1)/n⌋\lfloor (c-1)/n \rfloor⌊(c−1)/n⌋,最多8d8\sqrt{d}8d个值。
它们相当于把nnn的变化范围,分成了8d8\sqrt{d}8d个区间,每个区间再去求μ(n/k)\mu(n/k)μ(n/k)的区间和,这样就能够在O(d)O(\sqrt{d})O(d)的时间复杂度求出f(k)f(k)f(k).
这种方法叫整除分块, 形如a/xa/xa/x的值最多只有O(a)O(\sqrt{a})O(a)个值,可以将表达式分为O(a)O(\sqrt{a})O(a)类,最终的时间复杂度可以优化到O(a)O(\sqrt{a})O(a).
#include <bits/stdc++.h>
using namespace std;
#define LL long long int
#define MAXN 500005
int a, b, c, d, k, T, tot, last;
LL res;
int mu[MAXN], prime[MAXN], premu[MAXN];
bool flg[MAXN];
int getmu(){
mu[1] = 1;
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0) prime[tot++] = i, mu[i] = -1;
for(int j = 0; j < tot; j++){
if(prime[j] * i >= MAXN) break;
flg[prime[j] * i] = 1;
if(i % prime[j] == 0) {
mu[prime[j] * i] = 0;
break;
}
mu[prime[j] * i] = -mu[i];
}
}
}
int getpremu(){
for(int i = 1; i < MAXN; i++){
premu[i] = premu[i - 1] + mu[i];
}
}
int main(){
scanf("%d", &T);
getmu();
getpremu();
while(T--){
scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
int h1, l1, h2, l2;
res = 0;
last = 0;
for(int i = k; ;i = i + k){
h1 = (b/i);
l1 = (a - 1)/i;
h2 = (d/i);
l2 = (c - 1)/i;
int ii = MAXN;
if(a>i) ii = min(ii, (a-1)/((a-1)/i));
if(b>=i) ii =min(ii, b/(b/i));
if(c>i) ii =min(ii, (c-1)/((c-1)/i));
if(d>=i) ii =min(ii, d/(d/i));
i = ii - ii % k;
if(ii == MAXN)break;
res += 1ll * (premu[i/k] - premu[last/k]) * (h1 - l1) * (h2 - l2);
last = i;
}
printf("%lld\n", res);
}
return 0;
}
(3). YY的GCD
题目描述:
求有多少数对(x,y(1≤x≤n,1≤y≤m)(x,y(1\leq x \leq n, 1\leq y \leq m)(x,y(1≤x≤n,1≤y≤m)满足gcd(x,y)gcd(x,y)gcd(x,y)为质数。
数据范围
1≤n,m≤108,C≤1051 \leq n,m \leq 10^8, C \leq 10^51≤n,m≤108,C≤105, CCC表示多组数据。
分析
设f(p)f(p)f(p)表示在x,yx,yx,y的值nnn范围内gcd(x,y)gcd(x,y)gcd(x,y)为ppp的对数, 设F(p)F(p)F(p)表示gcd(x,y)gcd(x,y)gcd(x,y)为ppp的倍数的(x,y)(x,y)(x,y)的对数。
设PPP为在min(n,m)min(n,m)min(n,m)内的质数集合。
则有F(p)=∑p∣nf(n)F(p)=\sum_{p|n}f(n)F(p)=∑p∣nf(n).
F(1)=∑p≤nf(p)F(1)=\sum_{p\leq n} f(p)F(1)=∑p≤nf(p)
f(p)=∑p∣nμ(n/p)F(n)f(p) = \sum_{p|n}\mu(n/p)F(n)f(p)=∑p∣nμ(n/p)F(n)
f(1)=∑nμ(n)F(n)f(1)=\sum_{n}\mu(n)F(n)f(1)=∑nμ(n)F(n)
∑(p∈P)∧(1≤x≤n)∧(1≤y≤m)f(p)=∑(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)f(1)=∑(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)∧(1∣d)F(d)μ(d)=∑(p∈P)∧(d≤min(n/p,m/p))μ(d)(⌊n/pd⌋∗⌊m/pd⌋)\begin{aligned} \sum_{(p \in P) \land (1 \leq x \leq n) \land (1 \leq y \leq m)}f(p) &= \sum_{(p \in P) \land (1 \leq x \leq n/p) \land (1 \leq y \leq m/p)}f(1) \\ &= \sum_{(p \in P) \land (1 \leq x \leq n/p) \land (1 \leq y \leq m/p) \land(1 |d)} F(d)\mu(d) \\&= \sum_{(p \in P) \land(d \leq min(n/p, m/p))}\mu(d)(\lfloor n/pd \rfloor* \lfloor m/pd \rfloor) \end{aligned}(p∈P)∧(1≤x≤n)∧(1≤y≤m)∑f(p)=(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)∑f(1)=(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)∧(1∣d)∑F(d)μ(d)=(p∈P)∧(d≤min(n/p,m/p))∑μ(d)(⌊n/pd⌋∗⌊m/pd⌋)
令pdpdpd=T,
上式变为
∑(p∈P)∧(T≤min(n,m))μ(T/p)(⌊n/T⌋∗⌊m/T⌋)=∑T≤min(n,m)(⌊n/T⌋∗⌊m/T⌋)∑p∣Tμ(T/p)\begin{aligned} \sum_{(p \in P) \land (T\leq min(n, m))}\mu(T/p)(\lfloor n/T \rfloor * \lfloor m/T \rfloor) &= \sum_{T \leq min(n,m) }(\lfloor n/T \rfloor * \lfloor m/T \rfloor)\sum_{p|T }\mu(T/p)\end{aligned}(p∈P)∧(T≤min(n,m))∑μ(T/p)(⌊n/T⌋∗⌊m/T⌋)=T≤min(n,m)∑(⌊n/T⌋∗⌊m/T⌋)p∣T∑μ(T/p)
n/T,m/Tn/T, m/Tn/T,m/T最多只有2n,2m2\sqrt{n}, 2\sqrt{m}2n,2m 个,可以采用整除分块,将TTT的范围分成最多O(n)O(\sqrt{n})O(n)个区间。后面的∑p∣Tμ(T/p)\sum_{p|T}\mu(T/p)∑p∣Tμ(T/p),可以提前预处理出来,枚举ppp,然后去遍历ppp的倍数,一边遍历,一边累加μ(T/p)\mu(T/p)μ(T/p)即可。 因为:
$\begin{aligned} \sum_{p|T}(T/p)=T\sum_{p|T}1/p \lt T \sum_{x \lt T}1/x \lt TlnT \end{aligned} $
所以每个数均摊下来的时间复杂度是O(lnT)O(lnT)O(lnT)的,而质数的个数为O(T/lnT)O(T/lnT)O(T/lnT)个,所以,这个预处理时间复杂度为O(T)O(T)O(T)的。
每组数据通过整除分块,可以在N\sqrt{N}N内完成,所以,总的时间复杂度可以降为CNC\sqrt{N}CN.
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10000000
#define LL long long int
LL res;
int T, tot, n, m;
int mu[MAXN], prime[MAXN], premu[MAXN];
bool flg[MAXN];
void getmu(){
mu[1] = 1;
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0) prime[tot++] = i, mu[i] = -1;
for(int j = 0; j < tot; j++){
if(prime[j] * i >= MAXN) break;
flg[prime[j] * i] = 1;
if(i % prime[j] == 0) {
mu[prime[j] * i] = 0;
break;
}
mu[prime[j] * i] = -mu[i];
}
}
}
void getpremu(){
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0){
for(int j = 1; j * i < MAXN; j++){
premu[j*i] += mu[j];
}
}
}
for(int i = 2; i < MAXN; i++){
premu[i] = premu[i-1] + premu[i];
}
}
int main(){
scanf("%d", &T);
getmu();
getpremu();
while(T--){
scanf("%d %d", &n, &m);
int mi = min(n, m);
int last = 0;
res = 0;
for(int i = 1; i <= mi; ){
last = i - 1;
i = min(n/(n/i), m/(m/i));
res += 1ll*(premu[i] - premu[last])*(n/i)*(m/i);
i++;
}
printf("%lld\n", res);
}
return 0;
}
(4). 数表
题目描述
有一张 n×mn×mn×m 的数表,其第 iii 行第 jjj 列(1<=i<=n,1<=j<=m)(1 <= i <= n, 1 <= j <= m)(1<=i<=n,1<=j<=m)的数值为
能同时整除 i 和 j 的所有自然数之和。给定 a , 计算数表中不大于 a 的数之和。
数据范围
有QQQ组数据
1≤n,m≤105,∣a∣≤109,Q≤200001 \leq n,m \leq 10^5,|a| \leq 10^9, Q \leq 200001≤n,m≤105,∣a∣≤109,Q≤20000
分析
如果没有aaa的限制,则要求的是
∑i=1n∑j=1mσ(gcd(i,j))=∑d=1min(n,m)(σ(d)∑i=1n∑j=1m[gcd(i,j)=d])
\begin{aligned} \sum_{i=1}^n \sum_{j=1}^m \sigma (gcd(i,j)) =\sum_{d=1}^{min(n,m)} (\sigma(d) \sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)=d]) \end{aligned}
i=1∑nj=1∑mσ(gcd(i,j))=d=1∑min(n,m)(σ(d)i=1∑nj=1∑m[gcd(i,j)=d])
其中σ(x)\sigma(x)σ(x)表示xxx的约数之和。
设f(x)f(x)f(x)表示∑i=1n∑j=1m[gcd(i,j)=x]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j) = x]∑i=1n∑j=1m[gcd(i,j)=x], F(x)F(x)F(x)表示 ∑i=1n∑j=1m[x∣gcd(i,j)])=⌊n/x⌋∗⌊m/x⌋\sum_{i=1}^n\sum_{j=1}^m [x|gcd(i,j)]) = \lfloor n/x \rfloor * \lfloor m/x \rfloor∑i=1n∑j=1m[x∣gcd(i,j)])=⌊n/x⌋∗⌊m/x⌋
则有F(x)=∑x∣pf(p)F(x)=\sum_{x|p}f(p)F(x)=∑x∣pf(p)
根据莫比乌斯反演,则有:
f(x)=∑x∣pμ(p/x)F(p)=∑x∣pμ(p/x)(⌊n/p⌋∗⌊m/p⌋)f(x)=\sum_{x|p}\mu(p/x)F(p)=\sum_{x|p}\mu(p/x)(\lfloor n/p\rfloor * \lfloor m/p \rfloor)f(x)=∑x∣pμ(p/x)F(p)=∑x∣pμ(p/x)(⌊n/p⌋∗⌊m/p⌋)
则式(7)(7)(7) 可变为:
∑d=1min(n,m)(σ(d)∗f(d))=∑d=1min(n,m)(σ(d)∑d∣pμ(p/d)F(p))=∑p=1min(n,m)F(p)∑d∣pσ(d)∗μ(p/d)=∑p=1min(n,m)(⌊n/p⌋∗⌊m/p⌋)∗∑d∣pσ(d)∗μ(p/d)
\begin{aligned} \sum_{d=1}^{min(n,m)}(\sigma(d)*f(d)) &=\sum_{d=1}^{min(n,m)}(\sigma(d)\sum_{d|p}\mu(p/d)F(p)) \\ &=\sum_{p=1}^{min(n,m)}F(p)\sum_{d|p}\sigma(d)*\mu(p/d) \\ &= \sum_{p=1}^{min(n,m)}(\lfloor n/p\rfloor * \lfloor m/p \rfloor) *\sum_{d|p}\sigma(d)*\mu(p/d) \end{aligned}
d=1∑min(n,m)(σ(d)∗f(d))=d=1∑min(n,m)(σ(d)d∣p∑μ(p/d)F(p))=p=1∑min(n,m)F(p)d∣p∑σ(d)∗μ(p/d)=p=1∑min(n,m)(⌊n/p⌋∗⌊m/p⌋)∗d∣p∑σ(d)∗μ(p/d)
可以利用筛法,以O(nlogn)O(nlogn)O(nlogn)的时间复杂度,预处理出来∑d∣pσ(d)∗μ(p/d)\sum_{d|p}\sigma(d)*\mu(p/d)∑d∣pσ(d)∗μ(p/d)的前缀和,再利用整除分块在O(n)O(\sqrt{n})O(n)求出答案。
现在考虑aaa的限制,即
∑(d∣p)∧(σ(d)≤a)σ(d)∗μ(p/d)\begin{aligned} \sum_{(d|p) \land (\sigma(d) \leq a)} \sigma(d) * \mu(p/d) \end{aligned}(d∣p)∧(σ(d)≤a)∑σ(d)∗μ(p/d)
这个前缀和要怎么求呢?
可以按aaa由小到大对询问排序,并按σ(d)\sigma(d)σ(d)由小到大对ddd排序,采用树状数组来维护前缀和,每次将新的符合限制的σ(d)∗μ(p/d)\sigma(d)*\mu(p/d)σ(d)∗μ(p/d)加入进去。
时间复杂度为O(Nlog2N+Qn)O(Nlog^2N+Q\sqrt{n})O(Nlog2N+Qn)
四、狄利克雷卷积
设f,g,hf,g,hf,g,h为数论函数, 若h(n)=∑d∣nf(d)∗g(n/d)h(n)=\sum_{d|n}f(d)*g(n/d)h(n)=∑d∣nf(d)∗g(n/d), 则称hhh函数是g,fg,fg,f的狄利克雷卷积,写为:h=f∗gh=f*gh=f∗g.
狄利克雷卷积的性质:
一、满足交换律
f∗g=∑d∣nf(d)∗g(n/d)=∑d∣nf(n/d)∗g(d)=∑d∣ng(d)∗f(n/d)=g∗ff*g=\sum_{d|n}f(d)*g(n/d) = \sum_{d|n}f(n/d)*g(d)=\sum_{d|n}g(d)*f(n/d)=g*ff∗g=∑d∣nf(d)∗g(n/d)=∑d∣nf(n/d)∗g(d)=∑d∣ng(d)∗f(n/d)=g∗f
二、满足结合律
f∗g∗h=∑n∣m(f∗g)(n)∗g(m/n)=∑n∣m(∑d∣nf(d)∗g(n/d))∗h(m/n)=∑d∣mf(d)∗(∑j∣(m/d)g(j)∗h(m/(dj))=∑d∣mf(d)∗(g∗h)(m/d)=f∗(g∗h)\begin{aligned} f*g*h &= \sum_{n|m}(f*g)(n)*g(m/n) \\ &= \sum\limits_{n|m}(\sum\limits_{d|n}f(d)*g(n/d))*h(m/n) \\ &= \sum\limits_{d|m}f(d)*(\sum\limits_{j|(m/d)}g(j)*h(m/(dj)) \\ &= \sum_{d|m}f(d)*(g*h)(m/d) \\ &= f*(g*h)\end{aligned}f∗g∗h=n∣m∑(f∗g)(n)∗g(m/n)=n∣m∑(d∣n∑f(d)∗g(n/d))∗h(m/n)=d∣m∑f(d)∗(j∣(m/d)∑g(j)∗h(m/(dj))=d∣m∑f(d)∗(g∗h)(m/d)=f∗(g∗h)
ϵ\epsilonϵ是单位函数,其他函数与单位函数做狄利克雷卷积后结果不变。它的地位相当于乘法运算中的111, 加法运算中的000.
三、f∗ϵ=ff*\epsilon = ff∗ϵ=f
四、μ∗I=ϵ\mu * I = \epsilonμ∗I=ϵ, 即莫比乌斯函数和常数函数互在狄利克雷卷积下互为逆元函数。
五、f∗μ=g⇔f=g∗If*\mu = g \Leftrightarrow f=g*If∗μ=g⇔f=g∗I
常见的狄利克雷卷积:
-
μ∗I=ϵ\mu * I=\epsilonμ∗I=ϵ
-
μ∗Id=ϕ\mu *Id =\phiμ∗Id=ϕ
-
I∗Id=σI * Id = \sigmaI∗Id=σ
-
ϕ∗I=Id\phi * I = Idϕ∗I=Id
-
σ∗μ=Id\sigma * \mu = Idσ∗μ=Id
这些狄利克雷卷积,和莫比乌斯反演有很密切的关系,但狄利克雷卷积非常简洁,可以帮助我们更好的理解莫比乌斯反演。
-
μ∗I=ϵ\mu * I = \epsilonμ∗I=ϵ
莫比乌斯反演形式:
∵I(n)=∑d∣nϵ\because I(n)=\sum_{d|n}\epsilon∵I(n)=∑d∣nϵ(d)$, $
∴ϵ(n)=∑d∣nμ(d)∗I(n/d)\therefore \epsilon(n) = \sum_{d|n}\mu(d) * I(n/d)∴ϵ(n)=∑d∣nμ(d)∗I(n/d)
-
μ∗Id=ϕ\mu * Id = \phiμ∗Id=ϕ
莫比乌斯反演形式:
$\because n=\sum_{d|n}\phi(n/d) $
∴ϕ(n)=∑d∣nμ(d)∗Id(n/d)\therefore \phi(n) = \sum_{d|n}\mu(d)*Id(n/d)∴ϕ(n)=∑d∣nμ(d)∗Id(n/d)
-
I∗Id=σI*Id=\sigmaI∗Id=σ
即 σ(n)=∑d∣nd\sigma(n)=\sum_{d|n}dσ(n)=∑d∣nd
-
ϕ∗I=Id\phi*I=Idϕ∗I=Id
同2, 即$n=\sum_{d|n}\phi(n/d) $
-
σ∗μ=Id\sigma * \mu = Idσ∗μ=Id, 同333, 左右同时乘以III即可.
σ∗μ=Idσ∗μ∗I=Id∗Iσ=Id∗I \begin{aligned} \sigma * \mu &= Id \\ \sigma * \mu * I &= Id * I \\ \sigma &= Id * I \end{aligned} σ∗μσ∗μ∗Iσ=Id=Id∗I=Id∗I

本文介绍了数论函数的概念,包括约数函数σ(n)和欧拉函数φ(n),以及积性函数的性质。重点讨论了莫比乌斯函数及其反演公式,展示了如何利用莫比乌斯反演解决数论问题,例如计算与n互质的数的数量。此外,文章还探讨了狄利克雷卷积在数论函数中的应用,以及如何利用它来简化计算。最后,给出了几个具体的应用实例,如BZOJ2301problemB和数表问题,展示了莫比乌斯反演和狄利克雷卷积在解决实际问题中的有效性。
583

被折叠的 条评论
为什么被折叠?



