数论
- 若 a ≡ b ( m o d m ) a \equiv b (\mod m) a≡b(modm),则 ( a , m ) = ( b , m ) (a, m) = (b, m) (a,m)=(b,m)。
- a ≡ b ( m o d m i ) ( 1 ≤ i ≤ n ) a \equiv b(\mod m_i)(1 \le i \le n) a≡b(modmi)(1≤i≤n) 同时成立,当且仅当 a ≡ b ( m o d [ m 1 , m 2 , … , m n ] ) a \equiv b(\mod [m_1,m_2,\dots,m_n]) a≡b(mod[m1,m2,…,mn])。
- 素数定理 设 π ( x ) \pi(x) π(x) 为不超过 x x x 的素数个数,当 x → ∞ x \to \infty x→∞ 时, π ( x ) ∼ x ln ( x ) \pi(x) \thicksim \frac{x}{\ln(x)} π(x)∼ln(x)x。
线性求逆元
- 设模数为质数 P P P,待求逆元的为 k k k,则
P = ⌊ P k ⌋ k + ( P m o d k ) ⇔ ⌊ P k ⌋ k + ( P m o d k ) ≡ 0 ( m o d P ) \begin{aligned}P = \lfloor \frac{P}{k} \rfloor k + (P \mod k) \Leftrightarrow \lfloor \frac{P}{k} \rfloor k + (P \mod k) \equiv 0(\mod P)\end{aligned} P=⌊kP⌋k+(Pmodk)⇔⌊kP⌋k+(Pmodk)≡0(modP)
- 同乘 k − 1 ( P m o d k ) − 1 k^{-1}(P\mod k)^{-1} k−1(Pmodk)−1 后移项,得
k − 1 ≡ − ⌊ P k ⌋ ( P m o d k ) − 1 ( m o d P ) k^{-1} \equiv -\lfloor \frac{P}{k} \rfloor (P \mod k)^{-1} (\mod P) k−1≡−⌊kP⌋(Pmodk)−1(modP)
inv[1] = 1;
for (int i = 2; i <= n; ++i)
inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
快速乘
算法一
- 对乘数 b b b 进行二进制拆分,化乘法为加法,时间复杂度 O ( log b ) \mathcal O(\log b) O(logb)。
inline ll quickPower(ll a, ll b)
{
ll res = 0;
while (b)
{
if (b & 1)
add(res, a);
add(a, a);
b >>= 1;
}
return res;
}
算法二
- a b m o d p = a b − ⌊ a b p ⌋ p ab \mod p = ab - \lfloor \frac{ab}{p}\rfloor p abmodp=ab−⌊pab⌋p。
- 利用
long double
存储 ⌊ a b p ⌋ \lfloor \frac{ab}{p}\rfloor ⌊pab⌋,时间复杂度 O ( 1 ) \mathcal O(1) O(1),有极小的概率出错。
typedef long long ll;
typedef long double ld;
const ld eps = 1e-8;
inline ll quickPower(ll a, ll b)
{
ll res = a * b - (ll)((ld)a / mod * b + eps) * mod;
return res < 0 ? res + mod : res;
}
扩展欧几里得
- 设 d = gcd ( a , b ) d = \gcd(a,b) d=gcd(a,b),求 a x + b y = d ax + by = d ax+by=d 的一组 ( x , y ) (x, y) (x,y)
a x + b y = d , b x ′ + ( a m o d b ) y ′ = d b x ′ + ( a − ⌊ a b ⌋ b ) y ′ = d a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) = d x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ \begin{aligned}ax + by = d, bx' + (a\mod b)y' &= d \\bx'+(a - \lfloor \frac{a}{b}\rfloor b)y'&= d \\ay' + b(x' - \lfloor \frac{a}{b} \rfloor y') &= d \\x = y', y = x' - \lfloor \frac{a}{b} \rfloor y' \\\end{aligned} ax+by=d,bx′+(amodb)y′bx′+(a−⌊ba⌋b)y′ay′+b(x′−⌊ba⌋y′)x=y′,y=x′−⌊ba⌋y′=d=d=d
迭代到 a ′ = d , b ′ = 0 a' = d, b' = 0 a′=d,b′=0 可得 x ′ = 1 , y ′ = 0 x' = 1, y' = 0 x′=1,y′=0,由数学归纳法可得最后解的大小满足:
∣ x ∣ ≤ b , ∣ y ∣ ≤ a \begin{aligned}|x|\le b, |y|\le a\end{aligned} ∣x∣≤b,∣y∣≤a
inline void exGcd(ll a, ll b, ll &x, ll &y, ll &g)
{
if (!b)
{
x = 1;
y = 0;
g = a;
return ;
}
exGcd(b, a % b, y, x, g);
y -= a / b * x;
}
线性同余方程
- 定理1 若 ( a , b ) ∣ c (a,b)|c (a,b)∣c,则二元一次方程 a x + b y = c ( a , b , c ∈ N ) ax + by = c(a,b,c\in\mathbb N) ax+by=c(a,b,c∈N) 有无穷多解,否则方程不存在整数解。
- 定理2 若二元一次方程 a x + b y = c ( a , b , c ∈ N ) ax + by = c(a,b,c\in \mathbb N) ax+by=c(a,b,c∈N) 有解且特解为 x = x 0 , y = y 0 x = x_0, y = y_0 x=x0,y=y0,那么方程的解可表示为 x = x 0 + b d t , y = y 0 − a d t , t ∈ Z x = x_0 + \frac{b}{d}t, y = y_0 - \frac{a}{d}t, t\in \mathbb Z x=x0+dbt,y=y0−dat,t∈Z
- 定理3 n n n 元一次不定方程 ∑ i = 1 n a i x i = c ( a i , c ∈ N ) \sum \limits_{i = 1}^{n}a_ix_i = c(a_i,c\in\mathbb N) i=1∑naixi=c(ai,c∈N) 有解的充要条件为 ( a 1 , a 2 , … , a n ) ∣ c (a_1,a_2,\dots,a_n) | c (a1,a2,…,an)∣c
解 n 元一次不定方程
- 解 n n n 元一次不定方程 ∑ i = 1 n a i x i = c ( a i , c ∈ N ) \sum \limits_{i = 1}^{n}a_ix_i = c(a_i,c\in\mathbb N) i=1∑naixi=c(ai,c∈N) 。
顺次求出 ( a 1 , a 2 ) = d 2 , ( d 2 , a 3 ) = d 3 , … , ( d n − 1 , a n ) = d n (a_1, a_2) = d_2, (d_2, a_3) = d_3,\dots,(d_{n-1}, a_n) = d_n (a1,a2)=d2,(d2,a3)=d3,…,(dn−1,an)=dn。
若 d n ∣ c d_n | c dn∣c,则方程有解,作方程组
a 1 x 1 + a 2 x 2 = d 2 t 2 d 2 t 2 + a 3 x 3 = d 3 t 3 … d n − 1 t n − 1 + a n x n = c \begin{aligned} a_1x_1 + a_2x_2 &= d_2t_2 \\d_2t_2 + a_3x_3 &= d_3t_3 \\&\dots \\d_{n-1}t_{n-1} + a_nx_n &= c\\\end{aligned} a1x1+a2x2d2t2+a3x3dn−1tn−1+anxn=d2t2=d3t3…=c
求出最后一个方程的解,依次往上迭代。
解 n 元一次不定方程组
- 解 m m m 个 n n n 元一次不定方程组成的方程组,其中 m < n m < n m<n,由 m − 1 m - 1 m−1 个不定方程,消去 m − 1 m - 1 m−1 个未知数,将方程组转化为 n − m + 1 n - m + 1 n−m+1 元的一次不定方程。
解一元线性同余方程
- 二元一次不定方程 a x + b y = c ax + by = c ax+by=c ⇔ \Leftrightarrow ⇔ 求一元线性同余方程 a x ≡ c ( m o d b ) ax \equiv c(\mod b) ax≡c(modb) 整数解,设 d = gcd ( a , b ) d = \gcd(a, b) d=gcd(a,b),若 d d d 不能整除 c c c 则无解,否则在 m o d c \mod c modc 的意义下解有 d d d 个,解的形式为
x = x 0 + b d t , t ∈ Z \begin{aligned}x = x_0 + \frac{b}{d}t, t\in\mathbb Z\end{aligned} x=x0+dbt,t∈Z
解一元线性同余方程组
算法1 合并法
- 以合并下面两个方程为例,
x ≡ b 1 ( m o d m 1 ) x ≡ b 2 ( m o d m 2 ) \begin{aligned} x &\equiv b_1 (\mod m_1) \\ x &\equiv b_2 (\mod m_2) \\ \end{aligned} xx≡b1(modm1)≡b2(modm2)
设 x = b 1 + m 1 y 1 = b 2 + m 2 y 2 x = b_1 + m_1y_1 = b_2 + m_2 y_2 x=b1+m1y1=b2+m2y2,即 m 2 y 2 − m 1 y 1 = b 1 − b 2 m_2y_2 - m_1y_1 = b_1 - b_2 m2y2−m1y1=b1−b2
解出 y 2 y_2 y2,设 m = [ m 1 , m 2 ] m = [m_1,m_2] m=[m1,m2],得到方程 x ≡ b 2 + m 2 y 2 ( m o d m ) x \equiv b_2 + m_2y_2(\mod m) x≡b2+m2y2(modm)
若有多个方程,依据上述过程直至消成单个方程即可。
typedef __int128 ll;
inline ll calc_single(ll a, ll b, ll c)
{
ll x, y, e;
exGcd(a, b, x, y, e);
if (c % e != 0)
EXIT();
b /= e, c /= e;
return ((x * c) % b + b) % b;
}
inline ll calc_multi(ll *m, ll *c, int xp)
{
ll lcm = m[1], res = c[1];
for (int i = 2; i <= xp; ++i)
{
ll y = calc_single(lcm, m[i], ((c[i] - res) % m[i] + m[i]) % m[i]);
res = lcm * y + res;
lcm = lcm / std::__gcd(lcm, m[i]) * m[i];
res = (res % lcm + lcm) % lcm;
}
return res;
}
算法2 中国剩余定理
- 设 m 1 , m 2 , … , m r m_1,m_2,\dots,m_r m1,m2,…,mr 为两两互素的正整数,则同余方程组
x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) … x ≡ a r ( m o d m r ) \begin{aligned}x &\equiv a_1 (\mod m_1)\\x &\equiv a_2 (\mod m_2)\\&\dots \\x &\equiv a_r (\mod m_r)\\\end{aligned} xxx≡a1(modm1)≡a2(modm2)…≡ar(modmr)
有在模 M = ∏ i = 1 r m i M = \prod\limits_{i = 1}^{r}m_i M=i=1∏rmi 意义下的唯一解,即中国剩余定理。
- 设 M i = M m i M_i = \frac{M}{m_i} Mi=miM, t i t_i ti 为 M i t i = 1 ( m o d m i ) M_it_i = 1(\mod m_i) Miti=1(modmi) 的解,则唯一解为 x = ( ∑ i = 1 r a i t i M i ) m o d M x =\left( \sum\limits_{i=1}^{r}a_it_iM_i\right)\mod M x=(i=1∑raitiMi)modM
原根
阶
- 设 n , a ∈ N + , n > 1 , a ⊥ n n,a \in \mathbb N_{+}, n>1, a \perp n n,a∈N+,n>1,a⊥n,则 ∃ 1 ≤ r ≤ n , a r ≡ 1 ( m o d n ) \exist 1\le r\le n, a^r \equiv 1(\mod n) ∃1≤r≤n,ar≡1(modn),将最小的 r r r 称为 a a a 模 n n n 的阶,记作 Ord n ( a ) \text{Ord}_n(a) Ordn(a)。
- 若 a ⊥ n , a N ≡ 1 ( m o d n ) a\perp n, a^{N} \equiv 1(\mod n) a⊥n,aN≡1(modn),则 Ord n ( a ) ∣ N \text{Ord}_n(a) | N Ordn(a)∣N。
- 若 a ⊥ n a \perp n a⊥n, Ord n ( a ) ∣ ϕ ( n ) \text{Ord}_n(a) \vert \phi(n) Ordn(a)∣ϕ(n)。
原根
- 设 a , n ∈ N + , n > 1 , a ⊥ n a,n \in \mathbb N_{+}, n > 1, a\perp n a,n∈N+,n>1,a⊥n,若 Ord n ( a ) = ϕ ( n ) \text{Ord}_n(a) = \phi(n) Ordn(a)=ϕ(n),则称 a a a 为模 n n n 的一个原根。
- 剩余类 所有模 n n n 同余的整数构成的集合,设余数为 r r r,则该剩余类简记为 r ‾ \overline{r} r。
- 剩余系 模 n n n 所得的余数域。
- 简化剩余系 若模 n n n 的一个剩余类内所有数都与 n n n 互素,就称其为与模 n n n 互素的剩余类,在与模 n n n 互素的全体剩余类中,从每一个类中任取一个数作为代表组成的集合,称为模 n n n 的一个简化剩余系,容易证明,简化剩余系关于模 n n n 乘法封闭。
- 记 δ = Ord n ( a ) \delta = \text{Ord}_n(a) δ=Ordn(a),则 a 0 , a 1 , … , a δ − 1 a^0, a^1, \dots, a^{\delta - 1} a0,a1,…,aδ−1 两两不同余,当 a a a 是 n n n 的原根时, a 0 , a 1 , … , a δ − 1 a^0, a^1, \dots, a^{\delta - 1} a0,a1,…,aδ−1 构成模 n n n 的简化剩余系,当 n n n 为质数时, { a 0 , a 1 , … , a δ − 1 } \{a^0, a^1, \dots, a^{\delta - 1}\} {a0,a1,…,aδ−1} 与 { 1 , 2 , … , n − 1 } \{1,2,\dots,n -1\} {1,2,…,n−1} 构成双射。
- 只有 2 , 4 , p k , 2 p k ( p 为奇素数 ) 2,4,p^k,2p^k(p为奇素数) 2,4,pk,2pk(p为奇素数) 有原根。
- 若 n n n 存在原根,设 n n n 的最小原根为 g g g,则 g s m o d n ( 1 ≤ s ≤ ϕ ( n ) , s ⊥ ϕ ( n ) ) g^s \mod n(1\le s\le \phi(n), s\perp\phi(n)) gsmodn(1≤s≤ϕ(n),s⊥ϕ(n)) 一定也是它的原根,因此 n n n 共有 ϕ ( ϕ ( n ) ) \phi(\phi(n)) ϕ(ϕ(n)) 个原根。
原根的求法
- 暴力枚举最小原根 g g g,满足 g ⊥ n g\perp n g⊥n,要验证 g g g 是否是 n n n 的原根。
- 根据 Ord n ( a ) ∣ ϕ ( n ) \text{Ord}_n(a) | \phi(n) Ordn(a)∣ϕ(n),我们只需验证对于每个 d ∣ ϕ ( n ) ( d ≠ ϕ ( n ) ) d \vert \phi(n)(d \not = \phi(n)) d∣ϕ(n)(d=ϕ(n)),均有 a d ≢ 1 ( m o d n ) a^d \not \equiv 1(\mod n) ad≡1(modn)。
- 进一步地,设 ϕ ( n ) = ∏ i = 1 m p i c i \phi(n) = \prod \limits_{i = 1}^{m}p_i^{c_i} ϕ(n)=i=1∏mpici,我们只需对所有 p i p_i pi,验证 a ϕ ( n ) p i ≢ 1 ( m o d n ) a^{\frac{\phi(n)}{p_i}} \not \equiv 1(\mod n) apiϕ(n)≡1(modn)。
- 之后暴力枚举 s s s,满足 s ⊥ ϕ ( n ) s\perp \phi(n) s⊥ϕ(n),就能求出所有的原根。
inline void findRoot(int x)
{
int u = x, phi = x;
for (int i = 2, im = sqrt(x); i <= im && i <= u; ++i)
if (u % i == 0)
{
phi = phi / i * (i - 1);
u /= i;
while (u % i == 0)
u /= i;
}
if (u > 1)
phi = phi / u * (u - 1);
cm = am = 0;
u = phi;
for (int i = 2, im = sqrt(phi); i <= im && i <= u; ++i)
if (u % i == 0)
{
cur[++cm] = i;
u /= i;
while (u % i == 0)
u /= i;
}
if (u > 1)
cur[++cm] = u;
int g;
for (g = 1; g < x; ++g)
{
if (std::__gcd(g, x) > 1)
continue ;
bool flag = false;
for (int i = 1; i <= cm; ++i)
if (quick_pow(g, phi / cur[i], x) == 1)
{
flag = true;
break ;
}
if (!flag)
break ;
}
if (g == x)
return ;
int res = 1;
for (int s = 1; s <= phi; ++s)
{
res = 1ll * res * g % x;
if (std::__gcd(phi, s) > 1)
continue ;
ans[++am] = res;
}
std::sort(ans + 1, ans + am + 1);
}
数论函数
- 积性函数 函数 f f f 满足 ∀ a , b ∈ N , a ⊥ b \forall a,b\in \mathbb N,a\perp b ∀a,b∈N,a⊥b, f ( a b ) = f ( a ) f ( b ) f(ab) = f(a)f(b) f(ab)=f(a)f(b)。
- 完全积性函数 函数 f f f 满足 ∀ a , b ∈ N \forall a,b\in \mathbb N ∀a,b∈N, f ( a b ) = f ( a ) f ( b ) f(ab) = f(a)f(b) f(ab)=f(a)f(b)。
常见积性函数
欧拉函数
- 记作 φ ( n ) \varphi(n) φ(n),指不超过 n n n 且与 n n n 互素的正整数个数,由中国剩余定理可知其为积性函数。
- 定理1 设 n = ∏ i = 1 m p i c i n = \prod \limits_{i = 1}^{m}p_i^{c_i} n=i=1∏mpici,则 φ ( n ) = ∏ i = 1 m ( p i − 1 ) p i c i − 1 = ∏ i = 1 m ( 1 − 1 p i ) \varphi(n) = \prod \limits_{i = 1}^{m}(p_i - 1)p_i^{c_i - 1} = \prod\limits_{i = 1}^{m}(1 - \frac{1}{p_i}) φ(n)=i=1∏m(pi−1)pici−1=i=1∏m(1−pi1)。
- 推论1 当 n n n 为奇数时, φ ( 2 n ) = φ ( n ) \varphi(2n) = \varphi(n) φ(2n)=φ(n)。
- 推论2 设 n n n 为一个大于 2 的正整数,那么 φ ( n ) \varphi(n) φ(n) 是偶数。
- 定理2 当 n > 1 n > 1 n>1 时, [ 1 , n ] [1,n] [1,n] 中与 n n n 互质的整数的和为 n φ ( n ) 2 \frac{n\varphi(n)}{2} 2nφ(n)。
- 欧拉定理 对于任意两个互质的正整数 a , m ( m ≥ 2 ) a,m(m\ge2) a,m(m≥2),有 a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)}\equiv 1(\mod m) aφ(m)≡1(modm),故 a φ ( m ) − 1 a^{\varphi(m) - 1} aφ(m)−1 为 a a a 在模 m m m 意义下的逆元。
- 推论(费马小定理) 设 m m m 为质数, a m − 1 ≡ 1 ( m o d m ) a^{m - 1}\equiv 1(\mod m) am−1≡1(modm),故 a m − 2 a^{m-2} am−2 为 a a a 在模 m m m 意义下的逆元。
证明
- ∀ b , c \forall b,c ∀b,c, a b ≡ a c ( m o d m ) ⇔ a ( b − c ) ≡ 0 ( m o d m ) ab \equiv ac(\mod m) \Leftrightarrow a(b - c)\equiv 0(\mod m) ab≡ac(modm)⇔a(b−c)≡0(modm),因为 a ⊥ m a\perp m a⊥m, b ≡ c ( m o d m ) b\equiv c(\mod m) b≡c(modm),故当 b ≢ c ( m o d m ) b\not \equiv c (\mod m) b≡c(modm) 时, a b ‾ , a c ‾ \overline{ab},\overline{ac} ab,ac 也表示不同的剩余类。
- 设 m m m 的简化剩余系为 { a 1 ‾ , a 2 ‾ , … , a φ ( m ) ‾ } \{\overline{a_1},\overline{a_2},\dots,\overline{a_{\varphi(m)}}\} {a1,a2,…,aφ(m)} ,由其模 m m m 乘法封闭的性质以及上述结论,可以推知 { a a 1 ‾ , a a 2 ‾ , … a a φ ( m ) ‾ } \{\overline{aa_1},\overline{aa_2}, \dots\overline{aa_{\varphi(m)}}\} {aa1,aa2,…aaφ(m)} 也能表示 m m m 的简化剩余系,故:
a φ ( m ) a 1 a 2 … a φ ( m ) ≡ ( a a 1 ) ( a a 2 ) … ( a a φ ( m ) ) ≡ a 1 a 2 … a φ ( m ) ( m o d m ) a^{\varphi(m)} a_1a_2\dots a_{\varphi(m)} \equiv (aa_1)(aa_2)\dots(aa_{\varphi(m)}) \equiv a_1a_2\dots a_{\varphi(m)} (\mod m) aφ(m)a1a2…aφ(m)≡(aa1)(aa2)…(aaφ(m))≡a1a2…aφ(m)(modm)
- 由简化剩余系的定义可知 a φ ( m ) ≡ 1 ( m o d m ) a^{\varphi(m)} \equiv 1(\mod m) aφ(m)≡1(modm),证毕。
- 扩展欧拉定理 对于任意正整数 a , b , m a,b,m a,b,m,
- 若 a , m a,m a,m 不互质,且 b < φ ( m ) b < \varphi(m) b<φ(m),不能应用该定理进行降幂。
- 若 a , m a,m a,m 不互质,且 b ≥ φ ( m ) b \ge \varphi(m) b≥φ(m),则 a b ≡ a b m o d φ ( m ) + φ ( m ) ( m o d m ) a^b \equiv a^{b \mod \varphi(m) + \varphi(m)}(\mod m) ab≡abmodφ(m)+φ(m)(modm)。
- 若 a , m a,m a,m 互质,则 a b ≡ a b m o d ϕ ( m ) ( m o d m ) a^b \equiv a^{b \mod \phi(m)}(\mod m) ab≡abmodϕ(m)(modm)。
莫比乌斯函数
- 记作 μ ( n ) \mu(n) μ(n),若 n n n 有平方数因子,则 μ ( n ) = 0 \mu(n) = 0 μ(n)=0,否则 n n n 为 k k k 个不同质数的成绩,则 μ ( n ) = ( − 1 ) k \mu(n) = (-1)^k μ(n)=(−1)k。特别地 μ ( 1 ) = 1 \mu(1) = 1 μ(1)=1。
除数函数
- σ k ( n ) \sigma_k(n) σk(n) 表示 n n n 所有正因子的 k k k 次幂之和。
- d ( n ) = σ 0 ( n ) d(n) = \sigma_0(n) d(n)=σ0(n) 表示 n n n 的正因子个数, σ ( n ) = σ 1 ( n ) \sigma(n) = \sigma_1(n) σ(n)=σ1(n) 表示 n n n 的所有正因子之和。
幂函数
- I d k ( n ) = n k , 1 ( n ) = I d 0 ( n ) = 1 , I d ( n ) = I d 1 ( n ) = 1 Id_k(n) = n^k, 1(n) = Id_0(n) = 1, Id(n) = Id_1(n) = 1 Idk(n)=nk,1(n)=Id0(n)=1,Id(n)=Id1(n)=1。
单位函数
- ε ( n ) = [ n = 1 ] \varepsilon(n) = [n = 1] ε(n)=[n=1]。
Dirichlet 卷积
-
定义数论函数 f , g f,g f,g 的 Dirichlet \text{Dirichlet} Dirichlet 卷积为 ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n) = \sum \limits_{d|n}f(d)g(\frac{n}{d}) (f∗g)(n)=d∣n∑f(d)g(dn),满足交换律、结合律、分配律,且有单位元 ε \varepsilon ε。
-
若 f , g f,g f,g 均为积性函数,则 f ∗ g f*g f∗g 也为积性函数。
-
常见的 Dirichlet \text{Dirichlet} Dirichlet 卷积:
d = 1 ∗ 1 , σ = I d ∗ 1 , φ = μ ∗ I d , ε = μ ∗ 1 d = 1 * 1, \sigma = Id * 1, \varphi = \mu * Id, \varepsilon = \mu * 1 d=1∗1,σ=Id∗1,φ=μ∗Id,ε=μ∗1
-
由于 I d = 1 ∗ μ ∗ I d = 1 ∗ φ Id = 1 * \mu * Id = 1 * \varphi Id=1∗μ∗Id=1∗φ,即 n = ∑ d ∣ n φ ( d ) n = \sum \limits_{d | n}\varphi(d) n=d∣n∑φ(d)。
莫比乌斯反演
- 对于两个函数 f , g f,g f,g:
f ( n ) = ∑ d ∣ n g ( d ) ⇔ g ( n ) = ∑ d ∣ n μ ( n d ) f ( d ) f(n) = \sum \limits_{d | n}g(d) \Leftrightarrow g(n) = \sum \limits_{d|n} \mu(\frac{n}{d})f(d) f(n)=d∣n∑g(d)⇔g(n)=d∣n∑μ(dn)f(d)
证明
∵ f = 1 ∗ g ⇒ 1 ∗ μ ∗ g = μ ∗ f ⇒ g = μ ∗ f g = μ ∗ f ⇒ 1 ∗ g = 1 ∗ μ ∗ f ⇒ f = 1 ∗ g ∴ f = 1 ∗ g ⇔ g = μ ∗ f \begin{aligned} \because & f = 1 * g \Rightarrow 1 * \mu * g = \mu * f \Rightarrow g = \mu * f \\ & g = \mu * f \Rightarrow 1 * g = 1 * \mu * f \Rightarrow f = 1 * g \\ \therefore & f = 1 * g \Leftrightarrow g = \mu * f \end{aligned} ∵∴f=1∗g⇒1∗μ∗g=μ∗f⇒g=μ∗fg=μ∗f⇒1∗g=1∗μ∗f⇒f=1∗gf=1∗g⇔g=μ∗f
- 另一种形式:
f ( n ) = ∑ n ∣ d g ( d ) ⇔ g ( n ) = ∑ n ∣ d f ( d ) μ ( d n ) f(n) = \sum \limits_{n | d} g(d) \Leftrightarrow g(n) = \sum\limits_{n|d}f(d)\mu(\frac{d}{n}) f(n)=n∣d∑g(d)⇔g(n)=n∣d∑f(d)μ(nd)
证明
g ( n ) = ∑ n ∣ d f ( d ) μ ( d n ) = ∑ n ∣ d μ ( d n ) ∑ d ∣ t g ( t ) = ∑ n ∣ t g ( t ) ∑ d ∣ t n μ ( d ) = ∑ n ∣ t g ( t ) [ n = t ] = g ( n ) f ( n ) = ∑ n ∣ d g ( d ) = ∑ n ∣ d ∑ d ∣ t f ( t ) μ ( t d ) = ∑ n ∣ t f ( t ) ∑ d ∣ t n μ ( d ) = ∑ n ∣ t f ( t ) [ n = t ] = f ( n ) g(n) = \sum\limits_{n|d}f(d)\mu(\frac{d}{n}) = \sum \limits_{n|d} \mu(\frac{d}{n}) \sum \limits_{d|t}g(t) = \sum \limits_{n|t}g(t)\sum \limits_{d|\frac{t}{n}}\mu(d) = \sum \limits_{n|t}g(t)[n = t] = g(n) \\ f(n) = \sum \limits_{n | d}g(d) = \sum\limits_{n|d}\sum \limits_{d|t}f(t)\mu(\frac{t}{d}) = \sum \limits_{n|t}f(t)\sum\limits_{d|\frac{t}{n}}\mu(d) = \sum\limits_{n|t}f(t)[n = t] = f(n)\\ g(n)=n∣d∑f(d)μ(nd)=n∣d∑μ(nd)d∣t∑g(t)=n∣t∑g(t)d∣nt∑μ(d)=n∣t∑g(t)[n=t]=g(n)f(n)=n∣d∑g(d)=n∣d∑d∣t∑f(t)μ(dt)=n∣t∑f(t)d∣nt∑μ(d)=n∣t∑f(t)[n=t]=f(n)
线性筛
- 线性筛素数的流程如下:
- 设 l o w i low_i lowi 表示 i i i 的最小质因子。
- 考虑从 2 到 n n n 枚举 i i i,若 l o w i low_i lowi 还未被计算出来,则 i i i 为质数, l o w i = i low_i=i lowi=i。
- 枚举所有不超过 l o w i low_{i} lowi 的质数 p p p,令 l o w i p = p low_{ip} = p lowip=p。
- 在线性筛中,我们能得到每个数 n n n 的最小质因子 p p p 以及它的次数 k k k,则 f ( n ) = f ( p k ) f ( n p k ) f(n) = f(p^k)f(\frac{n}{p^k}) f(n)=f(pk)f(pkn),若 f ( p k ) f(p^k) f(pk) 可以快速求出,就能在线性筛的同时快速求出 f ( n ) f(n) f(n),有时也可利用积性函数本身的性质简化计算。
- 以 μ ( n ) , φ ( n ) , d ( n ) \mu(n),\varphi(n),d(n) μ(n),φ(n),d(n) 的筛法为例。
inline void sieve(int lim)
{
d[1] = phi[1] = mu[1] = 1;
for (int i = 2; i <= lim; ++i)
{
if (!low[i])
{
pri[++pn] = low[i] = i;
phi[i] = i - 1;
mu[i] = -1;
mx_d[i] = 1;
mx_i[i] = i;
d[i] = 2;
}
for (int j = 1; j <= pn && 1ll * i * pri[j] <= lim; ++j)
{
int k = pri[j] * i;
low[k] = pri[j];
if (low[i] == pri[j])
{
phi[k] = phi[i] * pri[j];
mu[k] = 0;
mx_d[k] = mx_d[i] + 1;
mx_i[k] = mx_i[i] * pri[j];
d[k] = d[k / mx_i[k]] * (mx_d[k] + 1);
break ;
}
mu[k] = -mu[i];
phi[k] = phi[i] * (pri[j] - 1);
mx_d[k] = 1;
mx_i[k] = pri[j];
d[k] = d[i] * 2;
}
}
}
整除分块
- 性质1 ⌊ ⌊ a b ⌋ c ⌋ = ⌊ a b c ⌋ \lfloor \frac{\lfloor\frac{a}{b}\rfloor}{c} \rfloor = \lfloor \frac{a}{bc}\rfloor ⌊c⌊ba⌋⌋=⌊bca⌋。
- 易证, ⌊ n d ⌋ \lfloor \frac{n}{d} \rfloor ⌊dn⌋ 的取值只有至多 2 n 2\sqrt n 2n 种,且 ⌊ n d ⌋ = ⌊ n x ⌋ \lfloor \frac{n}{d} \rfloor = \lfloor \frac{n}{x} \rfloor ⌊dn⌋=⌊xn⌋ 最大的 x x x 即满足 ⌊ n d ⌋ x ≤ n , x = ⌊ n ⌊ n d ⌋ ⌋ \lfloor \frac{n}{d} \rfloor x \le n, x = \lfloor \frac{n}{\lfloor \frac{n}{d}\rfloor} \rfloor ⌊dn⌋x≤n,x=⌊⌊dn⌋n⌋。
- n , m n,m n,m 两维的整除分块枚举如下:
for (int i = 1, x, im = Min(n, m); i <= im; i = x + 1)
{
x = Min(n / (n / i), m / (m / i));
...
}
- 性质2 ⌈ x + y P ⌉ = ⌊ x P ⌋ + ⌊ y P ⌋ + [ x m o d P + y m o d P ≥ P ] \lceil \frac{x + y}{P} \rceil = \lfloor \frac{x}{P} \rfloor + \lfloor \frac{y}{P} \rfloor +[x \bmod P+y\bmod P \ge P] ⌈Px+y⌉=⌊Px⌋+⌊Py⌋+[xmodP+ymodP≥P]
- 性质3 ⌈ x P ⌉ = ⌊ x + P − 1 P ⌋ = ⌊ x − 1 P ⌋ + 1 \lceil \frac{x}{P} \rceil = \lfloor \frac{x + P - 1}{P} \rfloor = \lfloor \frac{x - 1}{P} \rfloor + 1 ⌈Px⌉=⌊Px+P−1⌋=⌊Px−1⌋+1。
常见模型
- 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1≤n,m≤107,询问组数 T ≤ 1 0 4 T \le 10^4 T≤104:
∑ i = 1 n ∑ j = 1 m ( i , j ) = ∑ t = 1 min { n , m } t ∑ i = 1 n ∑ j = 1 m [ ( i , j ) = t ] = ∑ t = 1 min { n , m } t ∑ i = 1 ⌊ n t ⌋ ∑ j = 1 ⌊ m t ⌋ [ ( i , j ) = 1 ] = ∑ t = 1 min { n , m } t ∑ i = 1 ⌊ n t ⌋ ∑ j = 1 ⌊ m t ⌋ ∑ d ∣ i d ∣ j μ ( d ) = ∑ t = 1 min { n , m } t ∑ d μ ( d ) ⌊ n t d ⌋ ⌊ m t d ⌋ = ∑ T = t d = 1 min { n , m } ∑ t ∣ T t μ ( T t ) ⌊ n T ⌋ ⌊ m T ⌋ = ∑ T = 1 min { n , m } φ ( T ) ⌊ n T ⌋ ⌊ m T ⌋ \begin{aligned} &\sum \limits_{i = 1}^{n} \sum \limits_{j = 1}^{m}(i,j) \\= &\sum \limits_{t = 1}^{\min\{n,m\}}t\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[(i,j)=t]\\= &\sum \limits_{t = 1}^{\min\{n,m\}}t\sum\limits_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{t}\rfloor}[(i,j)=1]\\= & \sum \limits_{t = 1}^{\min\{n,m\}}t\sum\limits_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{t}\rfloor}\sum\limits_{d|i\\d|j}\mu(d)\\= & \sum \limits_{t = 1}^{\min\{n,m\}}t\sum\limits_{d}\mu(d)\lfloor\frac{n}{td}\rfloor\lfloor\frac{m}{td}\rfloor\\= & \sum\limits_{T=td=1}^{\min\{n,m\}}\sum \limits_{t | T}t\mu(\frac{T}{t})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\= & \sum\limits_{T=1}^{\min\{n,m\}}\varphi(T)\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\\end{aligned} ======i=1∑nj=1∑m(i,j)t=1∑min{n,m}ti=1∑nj=1∑m[(i,j)=t]t=1∑min{n,m}ti=1∑⌊tn⌋j=1∑⌊tm⌋[(i,j)=1]t=1∑min{n,m}ti=1∑⌊tn⌋j=1∑⌊tm⌋d∣id∣j∑μ(d)t=1∑min{n,m}td∑μ(d)⌊tdn⌋⌊tdm⌋T=td=1∑min{n,m}t∣T∑tμ(tT)⌊Tn⌋⌊Tm⌋T=1∑min{n,m}φ(T)⌊Tn⌋⌊Tm⌋
- 预处理出 φ \varphi φ 的前缀和,整除分块即可 ,类似上述推导可以直接得到以下代换式:
( i , j ) = ∑ d ∣ i , d ∣ j φ ( d ) (i,j) = \sum \limits_{d|i,d|j} \varphi(d) (i,j)=d∣i,d∣j∑φ(d)
- 结论 d ( i j ) = ∑ x ∣ i ∑ y ∣ j [ ( x , y ) = 1 ] d(ij) = \sum \limits_{x|i} \sum \limits_{y | j}[(x, y) = 1] d(ij)=x∣i∑y∣j∑[(x,y)=1]。
- 推论 d ( i j k ) = ∑ x ∣ i ∑ y ∣ j ∑ z ∣ k [ ( x , y ) = 1 ] [ ( y , z ) = 1 ] [ ( x , z ) = 1 ] d(ijk) = \sum \limits_{x|i}\sum \limits_{y | j}\sum \limits_{z|k}[(x,y)=1][(y,z) = 1][(x,z) = 1] d(ijk)=x∣i∑y∣j∑z∣k∑[(x,y)=1][(y,z)=1][(x,z)=1],具体应用见 SDOI2018旧试题,在有效边不多的情形下转化成三元环计数。
证明 考虑对于 i j ij ij 中的每一个质因数 p p p,其在 i j ij ij 中的次数为 b b b,在 i i i 中的次数为 a a a。
对于 i j ij ij 的任意一个约数 d d d,设 p p p 在 d d d 中的次数为 c c c,初始时令 x = y = 1 x = y = 1 x=y=1。
- 若 c ≤ a c \le a c≤a,令 x x x 乘上 p c p^c pc。
- 若 a < c ≤ b a < c \le b a<c≤b,令 y y y 乘上 p c − a p^{c - a} pc−a。
则对于任意一个约数 d d d,我们都能构造出唯一的一组互质的 x , y x,y x,y 与之对应,原命题得证。
典例 SDOI2018 旧试题
题目大意
- 求 ( ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C d ( i j k ) ) m o d ( 1 0 9 + 7 ) \left(\sum \limits_{i = 1}^{A}\sum\limits_{j = 1}^{B}\sum\limits_{k = 1}^{C}d(ijk)\right)\mod (10^9+7) (i=1∑Aj=1∑Bk=1∑Cd(ijk))mod(109+7), A , B , C ≤ 1 0 5 A,B,C\le 10^5 A,B,C≤105。
解法
∑ i = 1 A ∑ j = 1 B ∑ k = 1 C d ( i j k ) = ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C ∑ x ∣ i ∑ y ∣ j ∑ z ∣ k [ ( x , y ) = 1 ] [ ( y , z ) = 1 ] [ ( x , z ) = 1 ] = ∑ x = 1 A ∑ y = 1 B ∑ z = 1 C [ ( x , y ) = 1 ] [ ( y , z ) = 1 ] [ ( x , z ) = 1 ] ⌊ A x ⌋ ⌊ B y ⌋ ⌊ C z ⌋ = ∑ x = 1 A ∑ y = 1 B ∑ z = 1 C [ ( x , y ) = 1 ] [ ( y , z ) = 1 ] [ ( x , z ) = 1 ] ⌊ A x ⌋ ⌊ B y ⌋ ⌊ C z ⌋ = ∑ x = 1 A ∑ y = 1 B ∑ z = 1 C ∑ a ∣ x , a ∣ y μ ( a ) ∑ b ∣ y , b ∣ z μ ( b ) ∑ c ∣ x , c ∣ z μ ( c ) ⌊ A x ⌋ ⌊ B y ⌋ ⌊ C z ⌋ = ∑ a = 1 A ∑ b = 1 B ∑ c = 1 C μ ( a ) μ ( b ) μ ( c ) ∑ x ∣ lcm ( a , c ) ⌊ A x ⌋ ∑ y ∣ lcm ( a , b ) ⌊ B y ⌋ ∑ z ∣ lcm ( b , c ) ⌊ C z ⌋ \begin{aligned} \sum \limits_{i = 1}^{A}\sum\limits_{j = 1}^{B}\sum\limits_{k = 1}^{C}d(ijk) &= \sum \limits_{i = 1}^{A}\sum\limits_{j = 1}^{B}\sum\limits_{k = 1}^{C} \sum \limits_{x|i}\sum \limits_{y | j}\sum \limits_{z|k}[(x,y)=1][(y,z) = 1][(x,z) = 1] \\ & =\sum \limits_{x = 1}^{A}\sum\limits_{y = 1}^{B}\sum\limits_{z = 1}^{C} [(x,y)=1][(y,z) = 1][(x,z) = 1] \lfloor \dfrac{A}{x} \rfloor \lfloor \dfrac{B}{y} \rfloor \lfloor \dfrac{C}{z} \rfloor \\ & =\sum \limits_{x = 1}^{A}\sum\limits_{y = 1}^{B}\sum\limits_{z = 1}^{C} [(x,y)=1][(y,z) = 1][(x,z) = 1]\lfloor \dfrac{A}{x} \rfloor \lfloor \dfrac{B}{y} \rfloor \lfloor \dfrac{C}{z} \rfloor \\ & =\sum \limits_{x = 1}^{A}\sum\limits_{y = 1}^{B}\sum\limits_{z = 1}^{C} \sum \limits_{a|x,a|y}\mu(a)\sum \limits_{b|y,b|z}\mu(b)\sum \limits_{c|x,c|z}\mu(c)\lfloor \dfrac{A}{x} \rfloor \lfloor \dfrac{B}{y} \rfloor \lfloor \dfrac{C}{z} \rfloor \\ & = \sum \limits_{a = 1}^{A}\sum\limits_{b = 1}^{B}\sum\limits_{c = 1}^{C} \mu(a)\mu(b)\mu(c)\sum \limits _{x|\text{lcm}(a,c)}\lfloor \dfrac{A}{x}\rfloor \sum \limits _{y|\text{lcm}(a,b)}\lfloor \dfrac{B}{y}\rfloor \sum \limits _{z|\text{lcm}(b,c)}\lfloor \dfrac{C}{z}\rfloor \end{aligned} i=1∑Aj=1∑Bk=1∑Cd(ijk)=i=1∑Aj=1∑Bk=1∑Cx∣i∑y∣j∑z∣k∑[(x,y)=1][(y,z)=1][(x,z)=1]=x=1∑Ay=1∑Bz=1∑C[(x,y)=1][(y,z)=1][(x,z)=1]⌊xA⌋⌊yB⌋⌊zC⌋=x=1∑Ay=1∑Bz=1∑C[(x,y)=1][(y,z)=1][(x,z)=1]⌊xA⌋⌊yB⌋⌊zC⌋=x=1∑Ay=1∑Bz=1∑Ca∣x,a∣y∑μ(a)b∣y,b∣z∑μ(b)c∣x,c∣z∑μ(c)⌊xA⌋⌊yB⌋⌊zC⌋=a=1∑Ab=1∑Bc=1∑Cμ(a)μ(b)μ(c)x∣lcm(a,c)∑⌊xA⌋y∣lcm(a,b)∑⌊yB⌋z∣lcm(b,c)∑⌊zC⌋
- 将 a , b , c a,b,c a,b,c 看作图中的点,点数最多为 max { A , B , C } \max\{A,B,C\} max{A,B,C},对于图中任意两点 u , v u,v u,v,若 μ ( u ) μ ( v ) ≠ 0 \mu(u)\mu(v)\not = 0 μ(u)μ(v)=0 且 lcm ( u , v ) ≤ max { A , B , C } \text{lcm}(u,v) \le \max\{A,B,C\} lcm(u,v)≤max{A,B,C} 时连边 ( u , v ) (u,v) (u,v),转化为三元环计数。
杜教筛
- 设 S ( n ) = ∑ i = 1 n f ( i ) S(n) = \sum\limits_{i = 1}^{n} f(i) S(n)=i=1∑nf(i), 则有:
∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) g ( 1 ) S ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) \begin{aligned} \sum \limits_{i = 1}^{n} (f*g)(i) &= \sum \limits_{i = 1}^{n} \sum \limits_{d|i} g(d)f\left(\dfrac{i}{d}\right) = \sum \limits_{d = 1}^{n}g(d) S\left( \lfloor \frac{n}{d} \rfloor \right) \\ g(1)S(n) &= \sum \limits_{i = 1}^{n}(f*g)(i) - \sum \limits_{d = 2}^{n} g(d) S\left(\lfloor\dfrac{n}{d} \rfloor\right) \end{aligned} i=1∑n(f∗g)(i)g(1)S(n)=i=1∑nd∣i∑g(d)f(di)=d=1∑ng(d)S(⌊dn⌋)=i=1∑n(f∗g)(i)−d=2∑ng(d)S(⌊dn⌋)
- 若 g g g 的单点值和 ∑ i = 1 n ( f ∗ g ) ( i ) \sum \limits_{i = 1}^{n}(f*g)(i) i=1∑n(f∗g)(i) 都可以快速计算,则可通过数论分块计算 S ( n ) S(n) S(n)。
- 设 T ( n ) T(n) T(n) 为计算 S ( n ) S(n) S(n) 的时间复杂度,则:
T ( n ) = O ( n ) + O ( ∑ i = 2 n ( T ( i ) + T ( ⌊ n i ⌋ ) ) ) T(n) = \mathcal O(\sqrt{n}) + \mathcal O\left(\sum \limits_{i = 2}^{\sqrt{n}}\left(T(i) + T\left(\lfloor \dfrac{n}{i}\rfloor\right)\right)\right) T(n)=O(n )+O i=2∑n (T(i)+T(⌊in⌋))
T ( n ) = O ( n ) + ∑ i = 2 n ( O ( i ) + O ( ⌊ n i ⌋ ) ) = O ( n ) + O ( ∫ 2 n x d x ) + O ( ∫ 2 n n x d x ) = O ( n 3 4 ) T(n) = \mathcal O(\sqrt{n}) + \sum \limits_{i = 2}^{\sqrt{n}}\left(\mathcal O(\sqrt i) + \mathcal O \left(\sqrt{\lfloor \dfrac{n}{i}} \rfloor\right)\right) = \mathcal O(\sqrt n) +\mathcal O\left(\int ^{\sqrt{n}}_2\sqrt{x}\text{d}x\right) + \mathcal O\left(\int_2^{\sqrt n}\sqrt{\frac{n}{x}}\text{d}x \right)= \mathcal O(n^{\frac{3}{4}}) T(n)=O(n )+i=2∑n (O(i )+O(⌊in ⌋))=O(n )+O(∫2n x dx)+O(∫2n xn dx)=O(n43)
- 进一步地,若能 O ( k ) \mathcal O(k) O(k) 预处理 S ( 1 ) S(1) S(1) 到 S ( k ) S(k) S(k) 的值,则 T ( n ) T(n) T(n) 的计算式变为( 假设 k > n k > \sqrt{n} k>n ):
T ( n ) = O ( n ) + ∑ i = 2 ⌊ n k ⌋ O ( ⌊ n i ⌋ ) = O ( n ) + O ( ∫ 2 n k n x d x ) = O ( n k ) T(n) = \mathcal O(\sqrt{n}) + \sum \limits_{i = 2}^{\lfloor \frac{n}{k} \rfloor} \mathcal O\left(\sqrt{\lfloor \dfrac{n}{i} \rfloor}\right) = \mathcal O(\sqrt n ) + \mathcal O\left(\int_2^{\frac{n}{k}}\sqrt{\frac{n}{x}}\text{d}x \right) = \mathcal O(\frac{n}{\sqrt k}) T(n)=O(n )+i=2∑⌊kn⌋O(⌊in⌋ )=O(n )+O(∫2knxn dx)=O(k n)
- 取 k = n 2 3 k = n^{\frac{2}{3}} k=n32,总时间复杂度 O ( n 2 3 ) \mathcal O(n^{\frac{2}{3}}) O(n32)。
- 常见前缀和模型:
S μ ( n ) = ∑ i = 1 n μ ( i ) , ε = μ ∗ 1 ⇒ S μ ( n ) = 1 − ∑ i = 2 n S μ ( ⌊ n i ⌋ ) S φ ( n ) = ∑ i = 1 n φ ( i ) , I d = φ ∗ 1 ⇒ S φ ( n ) = n ( n + 1 ) 2 − ∑ i = 2 n S φ ( ⌊ n i ⌋ ) S 0 ( n ) = ∑ i = 1 n i 2 φ ( i ) , I d 3 = ( I d 2 φ ) ∗ I d ⇒ S 0 ( n ) = ( n ( n + 1 ) 2 ) 2 − ∑ i = 2 n i S 0 ( ⌊ n i ⌋ ) S_{\mu}(n) = \sum \limits_{i = 1}^{n}\mu(i) \ , \varepsilon = \mu * 1 \Rightarrow\ S_{\mu}(n) = 1 - \sum \limits_{i = 2}^{n} S_\mu\left(\lfloor \frac{n}{i}\rfloor\right) \\ S_{\varphi}(n) = \sum \limits_{i = 1}^{n}\varphi(i), Id = \varphi * 1 \Rightarrow S_\varphi(n) = \frac{n(n + 1)}{2} - \sum \limits_{i = 2}^{n}S_\varphi\left(\lfloor\dfrac{n}{i}\rfloor\right)\\ S_0(n) = \sum \limits_{i = 1}^{n}i^2 \varphi(i), Id^3 = (Id^2\varphi)*Id \Rightarrow S_0(n) = \left(\dfrac{n(n+1)}{2}\right)^2 - \sum \limits_{i = 2}^{n}i S_0\left(\lfloor\dfrac{n}{i}\rfloor\right) Sμ(n)=i=1∑nμ(i) ,ε=μ∗1⇒ Sμ(n)=1−i=2∑nSμ(⌊in⌋)Sφ(n)=i=1∑nφ(i),Id=φ∗1⇒Sφ(n)=2n(n+1)−i=2∑nSφ(⌊in⌋)S0(n)=i=1∑ni2φ(i),Id3=(Id2φ)∗Id⇒S0(n)=(2n(n+1))2−i=2∑niS0(⌊in⌋)
-
若需同时求 S μ ( n ) S_\mu(n) Sμ(n) 和 S φ ( n ) S_\varphi(n) Sφ(n),根据下式可将其转化为求 S μ ( n ) S_\mu(n) Sμ(n),时间复杂度分析类似,也为 O ( n 2 3 ) \mathcal O(n^{\frac{2}{3}}) O(n32),但单求 S φ ( n ) S_\varphi(n) Sφ(n) 常数更大。
∑ i = 1 n ∑ j = 1 n [ ( i , j ) = 1 ] = ∑ d = 1 n μ ( d ) ⌊ n d ⌋ 2 = 2 S φ ( n ) − 1 \sum \limits_{i = 1}^{n}\sum \limits_{j = 1}^{n}[(i,j)=1] = \sum \limits_{d = 1}^{n}\mu(d)\lfloor \frac{n}{d} \rfloor^2 = 2S_\varphi(n) - 1 i=1∑nj=1∑n[(i,j)=1]=d=1∑nμ(d)⌊dn⌋2=2Sφ(n)−1
-
以下为单求 S φ ( n ) S_\varphi(n) Sφ(n) 时的模板。
struct hashtable
{
#define MOD 999979
#define H 1000005
int adj[H], to[H], nxt[H], stk[H];
int top, T; ll cst[H];
bool vis[H];
inline void Clear()
{
while (top)
vis[stk[top--]] = false;
T = 0;
}
inline ll Find(int y)
{
int x = y % MOD;
for (int e = adj[x]; e; e = nxt[e])
if (to[e] == y)
return cst[e];
return Maxn;
}
inline void Insert(int y, ll z)
{
int x = y % MOD;
if (!vis[x])
vis[stk[++top] = x] = true;
nxt[++T] = adj[x]; adj[x] = T; to[T] = y; cst[T] = z;
}
}phiH;
inline ll calcPhi(int n)
{
if (n <= lim)
return phi[n];
ll res = phiH.Find(n);
if (res != Maxn)
return res;
res = 1ll * n * (n + 1) / 2;
for (ll i = 2, x; i <= n; i = x + 1)
{
x = n / (n / i);
res -= (x - i + 1) * calcPhi(n / i);
}
phiH.Insert(n, res);
return res;
}
质因数分解
Miller Rabin 素性测试
- 根据费马小定理,我们能够得出一种检验素数的思路(即费马素性测试):
- 验证 ∀ 1 < a < n , a n − 1 ≡ 1 ( m o d n ) \forall 1 < a < n, a^{n - 1} \equiv 1(\mod n) ∀1<a<n,an−1≡1(modn)。
- 很遗憾,上述做法并不能准确地判断素数,对于满足上述条件的合数,我们称之为卡迈克尔数。
- Miller Rabin \text{Miller Rabin} Miller Rabin 素性测试是基于费马素性测试的优化。
- 二次探测定理 若 P P P 为奇素数,则 x 2 ≡ 1 ⇔ x ≡ 1 ( m o d P ) 或 x ≡ P − 1 ( m o d P ) x^2 \equiv 1 \Leftrightarrow x\equiv 1(\mod P) 或 x \equiv P - 1(\mod P) x2≡1⇔x≡1(modP)或x≡P−1(modP)。
- 令 n − 1 = u × 2 t n - 1 = u \times 2^t n−1=u×2t,随机取一个 a a a,先求出 a u ( m o d n ) a^u(\mod n) au(modn),对该数平方 t t t 次,若在这一过程中出现在模 n n n 意义下为 1 或为 n − 1 n - 1 n−1,可认为通过了此轮测试。
- 经过理论证明,单轮错误率大约 1 4 \frac{1}{4} 41, T T T 轮测试的错误率为 4 − T 4^{-T} 4−T,一般取 T = 8 ∼ 12 T = 8 \sim 12 T=8∼12 即可。
- 若取 a = 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 a = 2,3,5,7,11,13,17,19,23,29,31,37 a=2,3,5,7,11,13,17,19,23,29,31,37(即前 12 个质数)可保证 n < 2 64 n < 2^{64} n<264 确定性判素。
生日悖论
- 求 k k k 个 [ 1 , n ] [1, n] [1,n] 的随机整数两两不相同的概率,设该事件为 A A A,则
P ( A ) = ∏ i = 1 k n − i + 1 n = ∏ i = 1 k ( 1 − i − 1 n ) P(A) = \prod \limits_{i = 1}^{k} \frac{n - i + 1}{n} = \prod\limits_{i = 1}^{k}(1 - \frac{i - 1}{n}) P(A)=i=1∏knn−i+1=i=1∏k(1−ni−1)
- n n n 较大时,根据近似 1 − i − 1 n ≈ ( 1 − 1 n ) i − 1 1 - \frac{i - 1}{n} \approx (1 - \frac{1}{n})^{i - 1} 1−ni−1≈(1−n1)i−1,且 e ≈ ( 1 + 1 n ) n e \approx (1 + \frac{1}{n})^n e≈(1+n1)n,原式可化为
P ( A ) ≈ ∏ i = 1 k ( 1 − 1 n ) i − 1 = ( 1 − 1 n ) k ( k − 1 ) 2 ≈ e − k ( k − 1 ) 2 n P(A) \approx \prod \limits_{i = 1}^{k}(1 - \frac{1}{n})^{i - 1} = (1 - \frac{1}{n})^{\frac{k(k - 1)}{2}} \approx e^{-\frac{k(k - 1)}{2n}} P(A)≈i=1∏k(1−n1)i−1=(1−n1)2k(k−1)≈e−2nk(k−1)
- 观察该式可知,当 k k k 取到 O ( n ) \mathcal O(\sqrt n) O(n ) 级别时, P ( A ) P(A) P(A) 会发生骤降。
- 因此 k k k 个 [ 1 , n ] [1,n] [1,n] 的随机整数首次出现相同数字时 k k k 的期望为 O ( n ) \mathcal O(\sqrt n) O(n )。
Pollard Rho 算法
- Pollard Rho \text{Pollard Rho} Pollard Rho 算法是一种基于随机的质因数分解算法,可以以期望时间复杂度 O ( n 1 4 ) \mathcal O(n^{\frac{1}{4}}) O(n41) 找到合数 n n n 的某个非平凡因子。
- 考虑选取适当的 k k k 使得 1 < d = gcd ( k , n ) < n 1 < d = \gcd(k,n) < n 1<d=gcd(k,n)<n,则显然 d d d 是 n n n 的一个约数,这样的 k k k 相对较多。
- 若 n n n 本身是质数,可直接用 Miller Rabin \text{Miller Rabin} Miller Rabin 素性测试判定。否则构造伪随机数列 x i + 1 = ( x i 2 + c ) m o d n x_{i + 1} = (x_i^2 + c)\mod n xi+1=(xi2+c)modn,其中 c c c 为初始时指定的某一随机数,设 m m m 为 n n n 的最小非平凡因子,令 y i = x i m o d m y_i = x_i \mod m yi=ximodm,则由生日悖论,满足 ∃ i < j , y i = y j \exist i∃i<j,yi=yj 所需的序列 x x x 的期望长度为 O ( m ) ≤ O ( n 1 4 ) \mathcal O(\sqrt m) \le \mathcal O(n^{\frac{1}{4}}) O(m )≤O(n41),期望枚举 O ( m ) \mathcal O(\sqrt m) O(m ) 个 i i i 我们便能得到 n n n 的一个约数 gcd ( ∣ x i − x j ∣ , n ) \gcd(|x_i - x_j|, n) gcd(∣xi−xj∣,n)。
- 可实际情况并不允许我们去暴力枚举所有 i , j i,j i,j,考虑到 x i x_i xi 的周期性,我们采用一种基于倍增的实现方式,即正序枚举 t ≥ 0 t\ge 0 t≥0,每次检查 gcd ( ∣ x i − x i + k ∣ , n ) ( 1 ≤ k ≤ 2 t ) \gcd(|x_i - x_{i+k}|,n)(1 \le k \le 2^t) gcd(∣xi−xi+k∣,n)(1≤k≤2t) 是否满足条件。
- 注意到 gcd ( a b m o d n , n ) = gcd ( a b , n ) ≥ gcd ( a , n ) , 1 ≤ a , b < n \gcd(ab \mod n, n) =\gcd(ab, n) \ge \gcd(a,n), 1 \le a,b < n gcd(abmodn,n)=gcd(ab,n)≥gcd(a,n),1≤a,b<n,实际实现时我们并不需要每次都暴力求 gcd \gcd gcd,而可以将若干次检查合为一次,以减小时间常数。
- 上述步骤许多部分基于估计,实际上并不严谨,但 Pollard Rho \text{Pollard Rho} Pollard Rho 算法在实际环境中运行得相当不错。
using std::vector;
typedef long long ll;
typedef __int128 s128;
template <class T>
inline T Abs(T x) {return x < 0 ? -x : x;}
template <class T>
inline void CkMax(T &x, T y) {x < y ? x = y : 0;}
inline ll quick_pow(ll x, ll k, ll mod)
{
ll res = 1;
while (k)
{
if (k & 1)
res = (s128)res * x % mod;
x = (s128)x * x % mod;
k >>= 1;
}
return res;
}
const int pri[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
inline bool millerRabin(ll n)
{
if (n < 3 || !(n & 1))
return n == 2;
ll u = n - 1;
int t = 0;
while (!(u & 1))
u >>= 1, ++t;
for (int i = 0; i < 12; ++i)
{
if (pri[i] >= n)
break ;
ll x = pri[i];
ll res = quick_pow(pri[i], u, n);
if (res == 1)
continue ;
int j = 0;
for (j = 0; j < t; ++j)
{
if (res == n - 1)
break ;
res = (s128)res * res % n;
}
if (j >= t)
return false;
}
return true;
}
inline ll f(ll x, ll c, ll n)
{
return ((s128)x * x + c) % n;
}
inline ll pollardRho(ll n)
{
ll rx = 0, x = 0, d, val = 1;
ll c = rand() % (n - 1) + 1;
for (int t = 1; ; t <<= 1, rx = x, val = 1)
{
for (int k = 1; k <= t; ++k)
{
x = f(x, c, n);
val = (s128)val * Abs(x - rx) % n;
if ((k % 127) == 0)
{
d = std::__gcd(val, n);
if (d > 1)
return d;
}
}
ll d = std::__gcd(val, n);
if (d > 1)
return d;
}
}
inline void Factor(ll n, vector<ll> &fac, int cnt)
{
if (n == 1)
return ;
if (millerRabin(n))
{
while (cnt--)
fac.push_back(n);
return ;
}
ll p = pollardRho(n);
int _cnt = 0;
while (n % p == 0)
n /= p, ++_cnt;
Factor(n, fac, cnt);
Factor(p, fac, cnt * _cnt);
}
本原勾股数组
- 定义 三元组 ( a , b , c ) (a,b,c) (a,b,c) 满足 a 2 + b 2 = c 2 a^2 + b^2 = c^2 a2+b2=c2, ( a , b , c ) = 1 (a,b,c) = 1 (a,b,c)=1。
- 性质1 a , b a,b a,b 奇偶不同,且 c c c 为奇数
证明 分情况讨论:
-
a , b a,b a,b 均为偶数, c c c 也为偶数, ( a , b , c ) = 2 (a,b,c) = 2 (a,b,c)=2,与定义矛盾。
-
a , b a,b a,b 均为奇数, c c c 为偶数,设 a = 2 x + 1 , b = 2 y + 1 , c = 2 z a = 2x + 1, b = 2y + 1, c = 2z a=2x+1,b=2y+1,c=2z,则
a 2 + b 2 = c 2 ⇔ ( 2 x + 1 ) 2 + ( 2 y + 1 ) 2 = ( 2 z ) 2 ⇔ 2 x 2 + 2 y 2 + 2 x + 2 y + 1 = 2 z 2 a^2 + b^2 = c^2 \Leftrightarrow (2x + 1)^2 + (2y + 1)^2 = (2z)^2 \Leftrightarrow 2x^2+2y^2 + 2x + 2y + 1 = 2z^2 a2+b2=c2⇔(2x+1)2+(2y+1)2=(2z)2⇔2x2+2y2+2x+2y+1=2z2
等式左边为奇数,右边为偶数,矛盾。
-
故只能满足 性质1。
- 性质2 a , b , c a,b,c a,b,c 两两互素。
证明 反证法,若 ( a , b ) = d ( d > 1 ) (a,b) = d(d > 1) (a,b)=d(d>1),设 a = d x , b = d y a = dx, b = dy a=dx,b=dy,则
c = ( d x ) 2 + ( d y ) 2 = d x 2 + y 2 c = \sqrt{(dx)^2 + (dy)^2} = d \sqrt{x^2 + y^2} c=(dx)2+(dy)2 =dx2+y2
则 c c c 也含有约数 d d d ,与定义矛盾,其余情况同理。
- 性质3 假定 a a a 为奇数, b b b 为偶数, c − b c - b c−b, c + b c + b c+b 均为平方数。
证明 设 d ∣ ( c − b , c + b ) d | (c - b, c + b) d∣(c−b,c+b),有
- d ∣ ( c − b + c + b ) ⇔ d ∣ 2 c d | (c - b + c + b) \Leftrightarrow d | 2c d∣(c−b+c+b)⇔d∣2c
- d ∣ [ c + b − ( c − b ) ] ⇔ d ∣ 2 b d | [c + b - (c - b)] \Leftrightarrow d | 2b d∣[c+b−(c−b)]⇔d∣2b
由 性质 2 b , c b,c b,c 互素 且 c − b c - b c−b 为奇数,一定有