Algorithm Review 3 数论

数论

  • a ≡ b ( m o d    m ) a \equiv b (\mod m) ab(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) ab(modmi)(1in) 同时成立,当且仅当 a ≡ b ( m o d    [ m 1 , m 2 , … , m n ] ) a \equiv b(\mod [m_1,m_2,\dots,m_n]) ab(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=kPk+(Pmodk)kPk+(Pmodk)0(modP)
  • 同乘 k − 1 ( P m o d    k ) − 1 k^{-1}(P\mod k)^{-1} k1(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) k1kP(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=abpabp
  • 利用 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)ybx+(abab)yay+b(xbay)x=y,y=xbay=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} xb,ya
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,cN) 有无穷多解,否则方程不存在整数解。
  • 定理2 若二元一次方程 a x + b y = c ( a , b , c ∈ N ) ax + by = c(a,b,c\in \mathbb N) ax+by=c(a,b,cN) 有解且特解为 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=y0dat,tZ
  • 定理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=1naixi=c(ai,cN) 有解的充要条件为 ( 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=1naixi=c(ai,cN)
    顺次求出 ( 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,,(dn1,an)=dn
    d n ∣ c d_n | c dnc,则方程有解,作方程组
    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+a3x3dn1tn1+anxn=d2t2=d3t3=c
    求出最后一个方程的解,依次往上迭代。

解 n 元一次不定方程组

  • m m m n n n 元一次不定方程组成的方程组,其中 m < n m < n m<n,由 m − 1 m - 1 m1 个不定方程,消去 m − 1 m - 1 m1 个未知数,将方程组转化为 n − m + 1 n - m + 1 nm+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) axc(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,tZ

解一元线性同余方程组

算法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} xxb1(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 m2y2m1y1=b1b2
    解出 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) xb2+m2y2(modm)
    若有多个方程,依据上述过程直至消成单个方程即可。
typedef __int128 ll;

inline ll calc_single(ll a, ll b, ll c)
{   // 返回 ax = c (mod b) 的特解 
	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)
{   // 返回方程组 x = ci(mod mi) (1 <= i <= xp) 在 [0,lcm(mi)) 内的特解  
	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} xxxa1(modm1)a2(modm2)ar(modmr)
    有在模 M = ∏ i = 1 r m i M = \prod\limits_{i = 1}^{r}m_i M=i=1rmi 意义下的唯一解,即中国剩余定理。
  • 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=1raitiMi)modM

原根

  • n , a ∈ N + , n > 1 , a ⊥ n n,a \in \mathbb N_{+}, n>1, a \perp n n,aN+,n>1,an,则 ∃ 1 ≤ r ≤ n , a r ≡ 1 ( m o d    n ) \exist 1\le r\le n, a^r \equiv 1(\mod n) ∃1rn,ar1(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) an,aN1(modn),则 Ord n ( a ) ∣ N \text{Ord}_n(a) | N Ordn(a)N
  • a ⊥ n a \perp n an 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,nN+,n>1,an,若 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,,n1} 构成双射。
  • 只有 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(1sϕ(n),sϕ(n)) 一定也是它的原根,因此 n n n 共有 ϕ ( ϕ ( n ) ) \phi(\phi(n)) ϕ(ϕ(n)) 个原根。

原根的求法

  • 暴力枚举最小原根 g g g,满足 g ⊥ n g\perp n gn,要验证 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) ad1(modn)
  • 进一步地,设 ϕ ( n ) = ∏ i = 1 m p i c i \phi(n) = \prod \limits_{i = 1}^{m}p_i^{c_i} ϕ(n)=i=1mpici,我们只需对所有 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,bN,ab 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,bN 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=1mpici,则 φ ( 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=1m(pi1)pici1=i=1m(1pi1)
    • 推论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(m2),有 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) am11(modm),故 a m − 2 a^{m-2} am2 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) abac(modm)a(bc)0(modm),因为 a ⊥ m a\perp m am b ≡ c ( m o d    m ) b\equiv c(\mod m) bc(modm),故当 b ≢ c ( m o d    m ) b\not \equiv c (\mod m) bc(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)a1a2aφ(m)(aa1)(aa2)(aaφ(m))a1a2aφ(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) ababmodφ(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) ababmodϕ(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}) (fg)(n)=dnf(d)g(dn),满足交换律、结合律、分配律,且有单位元 ε \varepsilon ε

  • f , g f,g f,g 均为积性函数,则 f ∗ g f*g fg 也为积性函数。

  • 常见的 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=11,σ=Id1,φ=μ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=dnφ(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)=dng(d)g(n)=dnμ(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=1g1μg=μfg=μfg=μf1g=1μff=1gf=1gg=μ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)=ndg(d)g(n)=ndf(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)=ndf(d)μ(nd)=ndμ(nd)dtg(t)=ntg(t)dntμ(d)=ntg(t)[n=t]=g(n)f(n)=ndg(d)=nddtf(t)μ(dt)=ntf(t)dntμ(d)=ntf(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; // i 最小质因子的次数 
			mx_i[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 cba=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 dnxn,x=dnn
  • 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+ymodPP]
  • 性质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+P1=Px1+1

常见模型

  • 1 ≤ n , m ≤ 1 0 7 1 \le n,m \le 10^7 1n,m107,询问组数 T ≤ 1 0 4 T \le 10^4 T104
    ∑ 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=1nj=1m(i,j)t=1min{n,m}ti=1nj=1m[(i,j)=t]t=1min{n,m}ti=1tnj=1tm[(i,j)=1]t=1min{n,m}ti=1tnj=1tmdidjμ(d)t=1min{n,m}tdμ(d)tdntdmT=td=1min{n,m}tTtμ(tT)TnTmT=1min{n,m}φ(T)TnTm
  • 预处理出 φ \varphi φ 的前缀和,整除分块即可 ,类似上述推导可以直接得到以下代换式:
    ( i , j ) = ∑ d ∣ i , d ∣ j φ ( d ) (i,j) = \sum \limits_{d|i,d|j} \varphi(d) (i,j)=di,djφ(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)=xiyj[(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)=xiyjzk[(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 ca,令 x x x 乘上 p c p^c pc
  • a < c ≤ b a < c \le b a<cb,令 y y y 乘上 p c − a p^{c - a} pca

则对于任意一个约数 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=1Aj=1Bk=1Cd(ijk))mod(109+7) A , B , C ≤ 1 0 5 A,B,C\le 10^5 A,B,C105

解法

∑ 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=1Aj=1Bk=1Cd(ijk)=i=1Aj=1Bk=1Cxiyjzk[(x,y)=1][(y,z)=1][(x,z)=1]=x=1Ay=1Bz=1C[(x,y)=1][(y,z)=1][(x,z)=1]xAyBzC=x=1Ay=1Bz=1C[(x,y)=1][(y,z)=1][(x,z)=1]xAyBzC=x=1Ay=1Bz=1Cax,ayμ(a)by,bzμ(b)cx,czμ(c)xAyBzC=a=1Ab=1Bc=1Cμ(a)μ(b)μ(c)xlcm(a,c)xAylcm(a,b)yBzlcm(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=1nf(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=1n(fg)(i)g(1)S(n)=i=1ndig(d)f(di)=d=1ng(d)S(dn)=i=1n(fg)(i)d=2ng(d)S(dn)

  • g g g 的单点值和 ∑ i = 1 n ( f ∗ g ) ( i ) \sum \limits_{i = 1}^{n}(f*g)(i) i=1n(fg)(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=2n (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=2n (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=2knO(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=1nμ(i) ,ε=μ1 Sμ(n)=1i=2nSμ(in)Sφ(n)=i=1nφ(i),Id=φ1Sφ(n)=2n(n+1)i=2nSφ(in)S0(n)=i=1ni2φ(i),Id3=(Id2φ)IdS0(n)=(2n(n+1))2i=2niS0(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=1nj=1n[(i,j)=1]=d=1nμ(d)dn2=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) // lim 取 max{n}^{2/3}
        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,an11(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) x21x1(modP)xP1(modP)
  • n − 1 = u × 2 t n - 1 = u \times 2^t n1=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 n1,可认为通过了此轮测试。
  • 经过理论证明,单轮错误率大约 1 4 \frac{1}{4} 41 T T T 轮测试的错误率为 4 − T 4^{-T} 4T,一般取 T = 8 ∼ 12 T = 8 \sim 12 T=812 即可。
  • 若取 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=1knni+1=i=1k(1ni1)
  • n n n 较大时,根据近似 1 − i − 1 n ≈ ( 1 − 1 n ) i − 1 1 - \frac{i - 1}{n} \approx (1 - \frac{1}{n})^{i - 1} 1ni1(1n1)i1,且 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=1k(1n1)i1=(1n1)2k(k1)e2nk(k1)
  • 观察该式可知,当 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 ii<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(xixj,n)
  • 可实际情况并不允许我们去暴力枚举所有 i , j i,j i,j,考虑到 x i x_i xi 的周期性,我们采用一种基于倍增的实现方式,即正序枚举 t ≥ 0 t\ge 0 t0,每次检查 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(xixi+k,n)(1k2t) 是否满足条件。
  • 注意到 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),1a,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)
{   // fac 存储所有质因子,顺序混乱 
    if (n == 1)
       return ;
    if (millerRabin(n))
    {
        while (cnt--)
            fac.push_back(n);
        return ;
    }
    ll p = pollardRho(n); // 求出 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)22x2+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 cb c + b c + b c+b 均为平方数。

    证明 d ∣ ( c − b , c + b ) d | (c - b, c + b) d(cb,c+b),有

    • d ∣ ( c − b + c + b ) ⇔ d ∣ 2 c d | (c - b + c + b) \Leftrightarrow d | 2c d(cb+c+b)d∣2c
    • d ∣ [ c + b − ( c − b ) ] ⇔ d ∣ 2 b d | [c + b - (c - b)] \Leftrightarrow d | 2b d[c+b(cb)]d∣2b

    性质 2 b , c b,c b,c 互素 且 c − b c - b cb 为奇数,一定有

你可能感兴趣的:(学习笔记,算法,数论)