Definations
- 剩余类:记膜 m 为 r 的自然数组成的集合 kr 为膜 m 的一个剩余类,任意 amodm=r 构成 kr 的一个代表元。
- 完系:每个 kr 中取一个代表元构成膜 m 的一个完系。
- 缩系/简化剩余系:对每个与 m 互质的 r,再 kr 中任取一个代表元构成膜 m 的一个缩系,若 gcd(x,m)=1 则将缩系中每个数都乘 x 后仍构成膜 m 的缩系。
Theorems
Bézout’s identity
ax+by=c 有整数解的充要条件是 gcd(a,b)∣c。
proof.
可以利用无穷递降法证明之。
Legendre theorem
记 vp(x) 表示 x 的质因数分解中 p 的系数,则 vp(n!)=∑i=1⌊pin⌋=p−1n−Sp(n),其中 Sp(n) 表示 n 在 p 进制下的数位和。
proof.
设 1,2,…,n 中 p 的指数为 r 的有 nr 个,那么
vp(n!)=n1+2n2+3n3+⋯=r≥1∑rnr=(n1+n2+…)+(n2+n3+…)+(n3+…)=N1+N2+…
其中 Nk 恰好是 1,2,…,n 中能被 pk 除尽的数的个数,即 Nk=⌊pkn⌋。Q.E.D.
Kummer’s theorem
vp((mn))=p−1Sp(m)+Sp(n−m)−Sp(n)
可以用 Legendre theorem 证明之。
Wilson’s theorem
(p−1)!≡−1(modp),等价于 p 是素数。
proof.
原式等价于方程 px+(p−1)!y=−1,方程显然有解,且若 p 不是质数则方程无解。Q.E.D.
Fermat’s little theorem
若 p 为素数,gcd(a,p)=1,则 ap−1≡1(modp).
另外一种更常用的表示是 ap−2≡a−1(modp).
proof.
归。可知 1p≡1(modp) 显然成立,若 ap≡a(modp) 成立,则
(a+1)p=i=0∑p(p−ip)ai
由于 (kp)=k!p(p−1)(p−2)…(p−k+1),于是 ∀k∈[1…n),(kp)≡0(modp),于是 (a+1)p≡ap+1≡a+1,由归纳定理,可知所证成立。Q.E.D.
Euler’s theorem
若 gcd(a,m)=1,则 aφ(m)≡1(modm).
proof.
设 r1,r2,…,rφ(m) 是 m 的一个简化剩余系,那么 ar1,ar2,…,arφ(m) 也是 m 的一个简化剩余系,于是
i=1∏φ(m)ri≡i=1∏φ(m)ari(modm)
∏i=1φ(m)ri 可约去,于是命题得证。□
当 m 为质数时,φ(m)=m−1,于是得到 Fermat’s little theorem。
extend Euler’s theorem
ab≡⎩⎪⎪⎨⎪⎪⎧abmodφ(m)aba(bmodφ(m))+φ(m)gcd(a,m)=1gcd(a,m)=1,b<φ(m)otherwise(modm)
Chinese Remainder Theorem,CRT
一元线性同余方程组
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)…x≡an(modmn)
有解,并且解可以被构造。其中 n 两两互质。
构造方式是:
记 M=∏i=1nmi,以及 Mi=M/mi,设 ti 使得 tiMi≡1(modmi)。于是通解形式为
x0=i=1∑naitiMi
所有解是 {kM+x0;k∈Z}。
这个东西很漂亮,难的是把构造想出来。
exCRT
如果 mi 并不一一互质,exCRT 告诉我们这种情况下仍然有解且给出了构造方式。
我们发现所有闪光的点子在这里似乎都失效了,于是考虑朴素一点的方法。一个同余方程我们会解,于是考虑把多个同余方程合并成一个。先考虑两个。
{x≡ai(modmi)x≡aj(modmj)
先将其转化为不定方程的形式
x=aip+mi=ajq+mj(p,q∈Z)⟺aip−ajq=mj−mi
如果 (ai,aj)∣(mj−mi),那么无解,否则可以拿扩欧算。整个过程朴素到没有亮点。
Lucas’ theorem
用途是求很大的 (kn)(modp)。
引理 1:若 n=0,p,则 (np)≡0(modp)
拿阶乘表示出来就行了。
引理 2:设 f(x)=axn+bxm,则有
fp(x)≡f(xp)(modp)
proof.
fp(x)=(axn+bxm)p=k=0∑p(kp)(axn)k(bxm)p−k≡apxpn+bpxpm≡a(xp)n+b(xp)m=f(xp)
Q.E.D.
Lucas 定理:
(kn)≡(⌊k/p⌋⌊n/p⌋)(kmodpnmodp)(modp)
proof.
考察 (kn) 的生成函数 (1+x)n。
(1+x)n=(1+x)p⌊n/p⌋(1+x)nmodp
由引理 2,可知
(1+x)n≡(1+xp)⌊n/p⌋(1+x)nmodp(modp)
xk 的系数就是 (kn)modp,并且把 k 拆在两边的方式是唯一的,也即
k=p⌊pn⌋+(nmodp)
于是定理得证。□
exLucas
如果模数 m 不是质数怎么办?
把 m 质因数分解,设
m=i=1∏spiαi
分别计算 (kn)modpiαi,得到 s 个同余方程,然后就可以使用 CRT 直接算。
Functions
Common productive functions
-
除数函数 σk(n)=∑d∣ndk
-
Euler 函数 φ(n)=∑i=1n[gcd(i,n)=1]
-
Mo¨bius 函数 μ(n)=⎩⎪⎪⎨⎪⎪⎧1(−1)k0n=1n为k个不同质数之积otherwise
常见的完全积性函数:
Dirichlet convolution
定义 ∗ 运算表示:
(f∗g)(n)=d∣n∑f(d)g(dn)
Dirichlet 卷积有以下性质:
-
交换律:f∗g=g∗f
-
结合率:(f∗g)∗h=f∗(g∗h)
-
分配率:f∗(g+h)=f∗g+f∗h
-
单位元:f∗ϵ=f,其中 ϵ(n)=[n=1]
-
若 f,g 都是积性函数,则 f∗g 也是积性函数
证明是显然的,这里不放了。
常见的卷积有:
- μ∗1=ϵ
- φ∗Id=1
- φ∗1=Id
- d(i,j)=x∣i∑y∣i∑[gcd(x,y)=1]
- φ(xy)=φ(gcd(x,y))φ(x)φ(y)gcd(x,y)
证明过程放在每个题里。
Mo¨bius Function
定义莫比乌斯函数 μ(n)。设 n=i=1∏kpiαi,有
μ(n)=⎩⎪⎪⎨⎪⎪⎧10(−1)kn=1∃i,αi≥2otherwise
可知这个函数是积性函数,于是可以线性筛求 μ。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void euler(int n) { mu[1] = 1; for (int i = 2; i <= n; i++) { if (!v[i]) p[++pcnt] = i, mu[i] = -1; for (int j = 1; j <= pcnt && i * p[j] <= n; j++) { v[i * p[j]] = 1; if (i % p[j] == 0) break; mu[i * p[j]] = -mu[i]; } } }
|
Mo¨bius Inversion
如果两个数论函数 f,g 满足:
f(n)=d∣n∑g(d)
则它们也同时满足:
g(n)=d∣n∑μ(d)f(dn)
反之亦然,即 f=g∗1⟺g=μ∗f。
proof.
左推右,考虑凑出 f∗μ,所以对两边都卷上 μ,有
f∗μ=g∗1∗μ
于是只要证 1∗μ=ϵ 就行了。这个引理十分重要,这里证一下。
考虑利用算贡献的方法,考虑每个因数会选出多少个质因数,考虑这个数量的贡献求和,来改写式子左边有,
LHS=d∣n∑μ(d)=i=0∑k(−1)i(ki)=(1−1)n=ϵ(n)=RHS,□
于是有 f∗μ=g∗ϵ=g,充分性得证。
必要性只需要把两边都卷上 1 就行了。Q.E.D.
在基础应用中,最常用的是证明过程中顺手证的引理,但是正牌莫反会有更多的用处。但我们先不急着去做题,莫比乌斯反演还有一种非卷积形式:
设 f,g 为数论函数,t 为完全积性函数且 t(1)=1,有
f(n)=k=1∑nt(k)g(⌊kn⌋)⟺g(n)=k=1∑nt(k)μ(k)f(⌊kn⌋)
proof.
左推右,有
k=1∑nμ(k)t(k)f(⌊kn⌋)=k=1∑nμ(k)t(k)i=1∑⌊kn⌋t(i)g(⌊kin⌋)
枚举 ki,有
k=1∑nμ(k)t(k)f(⌊kn⌋)=j=1∑ng(⌊jn⌋)i∣j∑t(i)t(ij)μ(i)=j=1∑ng(⌊jn⌋)t(j)i∣j∑μ(i)
由引理,得
k=1∑nμ(k)t(k)f(⌊kn⌋)=j=1∑ng(⌊jn⌋)t(j)ϵ(j)=g(n)t(1)=g(n)
反之亦然。Q.E.D.
Basical Problems
1.GCD SUM
求
i=1∑nj=1∑ngcd(i,j)
sol.
先证引理:φ(n)=∑d∣nμ(d)dn。
ϕ(n)=i=1∑n[gcd(i,n)=1]=i=1∑nd∣gcd(i,n)∑μ(d)
然后考虑 μ(d) 的贡献,有
φ(n)=d∣n∑μ(d)dn
故引理得证。这个引理也很常用。
Ans=i=1∑nj=1∑nd=1∑n[gcd(i,j)=d]d=d=1∑ndi=1∑⌊dn⌋j=1∑⌊dn⌋ϵ(gcd(i,j))=d=1∑ndi=1∑⌊dn⌋j=1∑⌊dn⌋k∣gcd(i,j)∑μ(k)=d=1∑ndk=1∑nμ(k)⌊dkn⌋2=D=1∑n⌊Dn⌋2d∣D∑dμ(dD)=D=1∑n⌊Dn⌋2φ(n)
其中第一行到第二行我们把 d 提到前面去,改枚举 i,j 为 di,dj,把 [gcd(i,j)=d] 转化为 gcd(di,dj)=1,就可以利用莫反了。所以第二步到第三步就是生套莫反公式,第三步到第四步是考虑 μ(k) 的贡献,然后再改求和顺序。这样线性筛 φ,求前缀和,然后整除分块就可以 O(n) 做了,瓶颈是线性筛。
请格外注意过程中对和式的处理。
2.Crash 的数字表格 / JZPTAB
求
i=1∑nj=1∑mlcm(i,j)
sol.
Ans=i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)ij
然后利用经典算贡献套路把 d 提出来,枚举 i,j 改为枚举 di,dj 来枚举 gcd(i,j),不妨设 n≤m,有
Ans=d=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)=1]ij=d=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋ϵ(gcd(i,j))ij
由莫比乌斯反演公式,我们有 ∑d∣nμ(d)=ϵ(n),于是原式转化为
d=1∑ni=1∑⌊dn⌋j=1∑⌊dm⌋x∣gcd(i,j)∑μ(x)ij
然后再利用枚举 gcd 的套路,有
Ans=d=1∑ndx=1∑⌊dn⌋μ(x)xi=1∑⌊dn⌋xj=1∑⌊dm⌋x2ij=d=1∑ndx=1∑⌊dn⌋μ(x)x2(i=1∑⌊dxn⌋i)(j=1∑⌊dxn⌋j)
记 s(x)=∑i=1xi,于是有
Ans=d=1∑nx=1∑⌊dn⌋μ(x)x2s(⌊dxn⌋)s(⌊dxm⌋)
把 s(⌊dxn⌋)s(⌊dxm⌋) 提前面,就有
Ans=D=1∑ns(⌊Dn⌋)s(⌊Dm⌋)db=D∑db2μ(b)=D=1∑ns(⌊Dn⌋)s(⌊Dm⌋)Db∣D∑bμ(b)
然后预处理 bμ(b) 的 Dirichlet 前缀和,然后整除分块就能做了。
3.约数个数和
设 d(x) 表示 x 的约数个数,求
i=1∑nj=1∑md(ij)
sol.
先想着利用 d 的积性,把 d(ij) 转化为 d(gcd(i,j))d(i)d(j),发现推得
Ans=i=1∑md(i)1⋅(j=1∑nd(j))⋅(j=1∑md(j))
如果所求有取模,那直接预处理 sumi=1nd(i) 和 ∑i=1nd(i)1 就可以做到 O(n) 了,但这个题没有取模的要求,考虑直接求 d(ij)。我们有引理:
d(xy)=i∣x∑j∣y∑[gcd(i,j)=1]
proof. 不会,抄的题解,但感觉很有用,记一下以后常看看。
然后莫反的过程就比较平凡了。
加强一下:[SDOI2018] 旧试题
求
i=1∑Aj=1∑Bk=1∑Cd(ijk)
sol.
还不会
Du’s Algorithm
设 f 为数论函数,要求
S(n)=i=1∑nf(i)
考虑构造一个数论函数 g,我们有恒等式
i=1∑n(f∗g)(i)=i=1∑ng(i)S(⌊in⌋)
得到递归式
g(1)S(n)=i=1∑n(f∗g)(i)−i=2∑ng(i)S(⌊in⌋)
熟知 ⌊in⌋ 的取值为 O(n) 的,假如可以快速对 (f∗g)(i) 与 g(i) 的和,可以根据 ⌊in⌋ 的值进行数论分块,进行一遍求和的时间复杂度就是 O(n),然后总的复杂度就是
i=1∑⌊n⌋O(i)+i=1∑⌊n⌋O(in)
(温情提示:前方积分预警)
后面一部分明显比前一部分大,所以考虑算后面的。
i=1∑⌊n⌋O(in)≈O(∫0nxndx)=O(n43)
你可能说积分算大了,但你舍掉左边那一部分本来就算小了啊。
考虑能否优化这个过程,我们考虑预处理一部分,然后剩下部分直接调用算好的。我们设预处理了前 k 个 S 并假设预处理的复杂度为 O(n),那么复杂度就是
O(k)+O(i=2∑⌊kn⌋in)≈O(k+∫0knxndx)=O(k+kn)
由均值不等式可知当 k 取 n32 是复杂度最小,为 O(n32)。
A Simple Math Problem
求
i=1∑nj=1∑nijgcd(i,j)
sol.
利用莫反常见套路推出来
Ans=T=1∑n(i=1∑⌊Tn⌋i)2T2φ(T)
然后考虑算 S(n)=∑i=1ni2φ(i)。我们套用杜教筛板子
g(1)S(n)=i=1∑n(f∗g)(i)−i=2∑ng(i)S(⌊in⌋)
我们想到 φ 的常见卷积
φ∗1=Id
于是令 g(x)=x2,有
(g∗f)(i)=d∣n∑d2φ(d)d2i2=i2d∣n∑φ(d)=i3
然后就可以快速地进行杜教筛。
Technologies
Miller–Rabin test
Pollard Rho Algorithm