整除理论:
- 唯一分解定理,对于一个合数,唯一存在一种质数分解。
应用在算法复杂度估计,因子个数的计算。
素因子个数为 O ( l o g n ) O(log n)O(logn) 级别
因子个数为 O ( n 3 ) O(\sqrt[3]{n})O(3n) ~ O ( n ) O(\sqrt{n})O(n) 级别 - 如果一个数能被一堆数整除,那么这个数被称为这些数的公约数。
裴蜀定理
对于 a , b a,ba,b,存在 x , y x,yx,y 使得 a x + b y = g c d ( a , b ) ax + by = gcd(a, b)ax+by=gcd(a,b)
考虑 b = 0 b = 0b=0 时,令 x = 1 , y = 0 x = 1, y = 0x=1,y=0
g c d ( a , b ) = a x + b y = b y + ( a % b + a b ∗ b ) x = b ( y + a b ∗ x ) + a % b ∗ x gcd(a,b) = ax+by = by+(a\%b+\frac{a}{b}*b)x=b(y+\frac{a}{b}*x)+a\%b*xgcd(a,b)=ax+by=by+(a%b+ba∗b)x=b(y+ba∗x)+a%b∗x
同余理论
剩余类:
将 Z ZZ 根据除 M MM 的余数分为 M MM 个不相交的集合
例如余数为 a ( 0 ≤ a < M ) a(0 ≤ a < M)a(0≤a<M), 则集合为 { k M + a } \{kM+a \}{kM+a}
将此集合记为 [ a ] , a [a] , a[a],a 是一个代表元
[ a ] [a][a] 内和 [ b ] [b][b] 内的两个数做加法和乘法运算,得到的结果所属剩余类就是 [ a + b ] [a+b][a+b] 和 [ a b ] [ab][ab]
所以我们可以将描述放在剩余类内
欧拉定理
- 定义 φ ( n ) \varphi (n)φ(n) 为 1 n 1~n1 n 中与 n nn 互质的数的个数
- 则有 a φ ( n ) ≡ 1 ( m o d n ) , g c d ( a , n ) = 1 a^{\varphi (n)} ≡ 1 (mod n) , gcd(a, n) = 1aφ(n)≡1(modn),gcd(a,n)=1
- 例如 5 7 ≡ 5 ( m o d 7 ) , 3 4 ≡ 1 ( m o d 10 ) 5^7 ≡ 5 (mod 7) , 3^4 ≡ 1 (mod 10)57≡5(mod7),34≡1(mod10)
- 唯一分解 n = p 1 e 1 + p 2 e 2 + . . . + p k e k = ∏ i = 1 k p i e i n=p_1^{e_1}+p_2^{e_2}+...+p_k^{e_k}=\prod_{i=1}^kp_i^{e_i}n=p1e1+p2e2+...+pkek=∏i=1kpiei
- 则 φ ( n ) = ∏ i = 1 k ( p i − 1 ) p i e i \varphi (n) = \prod_{i=1}^k(p_i-1)p_i^{e_i}φ(n)=∏i=1k(pi−1)piei
- 拓展到a与n不互质的情况
a m ≡ { a m m < φ ( n ) a ( m m o d φ ( n ) ) + φ ( n ) m ≥ φ ( n ) a^m ≡ \begin{cases} a^m & m<\varphi (n) \\ a^{(m mod \varphi (n))+\varphi (n)} & m\geq\varphi (n) \end{cases}am≡{ama(mmodφ(n))+φ(n)m<φ(n)m≥φ(n) - 只需要考虑 a aa 标准分解中与 n nn 不互质的 p pp
逆元
- 在数论中引入类似倒数的概念
- p pp 不为 0 00,是否存在 q qq 使得 p q ≡ 1 ( m o d m ) ? pq ≡ 1 (mod m) ?pq≡1(modm)?
- 当 p , m p,mp,m 互质时存在(由欧拉定理可知)
- 快速幂计算 q ≡ p φ ( m ) − 1 ( m o d m ) q ≡ p^{\varphi (m)-1} (mod m)q≡pφ(m)−1(modm)
- 由于很多情况下 m mm 为质数 p pp,此时幂取 p − 2 p-2p−2 即可
- 拓展欧几里得算法也可以计算
- 要求很多个怎么办?可以线性递推,不妨令 p = k q + r p=kq+rp=kq+r,
则有 k q + r ≡ 0 ( m o d p ) ⟺ k − 1 ≡ q r − 1 ( m o d p ) kq+r≡0(mod p)⟺k^{-1}≡qr^{-1}(mod p)kq+r≡0(modp)⟺k−1≡qr−1(modp)
同余方程
线性同余方程
- 考虑 a x ≡ b ( m o d m ) ax ≡ b (mod m)ax≡b(modm)
- 即有不定方程 a x − m y = b ax − my = bax−my=b
- 利用拓展欧几里得算法求解
- 注意:有无解/一解/多解情况
同余方程组
- 给出多个同余式,求方程组的解
- 先将各个同余式进行独立求解
- 模数两两互质:中国剩余定理,利用类似牛顿插值法的方式合并
- 有模数不互质:最后的模是它们的最小公倍数,用拓展欧几里得两两合并
- 当然也有无解/一解/多解之分
高次同余方程
- x k ≡ a ( m o d m ) x^k ≡ a (mod m)xk≡a(modm)
- 求 s > 0 s>0s>0 使得 a s ≡ 1 ( m o d m ) a^s ≡ 1 (mod m)as≡1(modm)
- 即求 k s ≡ 0 ( m o d φ ( m ) ) ks ≡ 0 (mod \varphi (m) )ks≡0(modφ(m))
- 注意:有无解/一解/多解情况
数论分块
几个引理
- 整除套整除 a b c = a b c \frac{\frac{a}{b}}{c}=\frac{a}{bc}cba=bca
- 在所有 n i = k \frac{n}{i}=kin=k 的 i ii 中,最大的是 n k \frac{n}{k}kn
除商的个数
- 考虑 n 1 , n 2 , n 3 , . . . , n n \frac{n}{1},\frac{n}{2},\frac{n}{3},...,\frac{n}{n}1n,2n,3n,...,nn
- 举例: n = 10 n=10n=10 时有 1 , 2 , 3 , 5 , 10 1,2,3,5,101,2,3,5,10
- k 2 ≤ n < k ( k + 1 ) k^2 ≤ n < k(k+ 1)k2≤n<k(k+1) 时,有 2 k − 1 2k − 12k−1 个
- k ( k + 1 ) ≤ n < ( k + 1 ) 2 k (k + 1) ≤ n < (k + 1)^ 2k(k+1)≤n<(k+1)2 时,有 2 k 2k2k 个
- 不同的值约有 O ( n ) O( \sqrt n)O(n) 个
除商的值
- 升序排序 n 1 , n 2 , n 3 , . . . , n n \frac{n}{1},\frac{n}{2},\frac{n}{3},...,\frac{n}{n}1n,2n,3n,...,nn 中不同的值
- 前方连续 1 , 2 , … , k 1, 2, … , k1,2,…,k
- 后方 n k , n k − 1 , n k − 2 , . . . , n 1 \frac{n}{k},\frac{n}{k-1},\frac{n}{k-2},...,\frac{n}{1}kn,k−1n,k−2n,...,1n
- 根据引理 2 22 可以 O ( 1 ) O(1)O(1) 搞定块长
- 以 n k \frac{n}{k}kn 值相同的块合并,就是数论分块啦
- 分块实现
for (int l = 1, r; l <= n; l = r + 1)
{
r = n / (n / l);
ans += ...;
}
积性函数
- 我们称 f : Z + → C f: Z^+ → Cf:Z+→C 为数论函数
- 积性函数 ∀ a , b , g c d ( a , b ) = 1 ∀a, b, gcd (a,b) = 1∀a,b,gcd(a,b)=1 f ( a ) f ( b ) = f ( a b ) f(a)f(b) = f(ab)f(a)f(b)=f(ab)
- 完全积性函数 f ( a ) f ( b ) = f ( a b ) f(a)f(b) = f(ab)f(a)f(b)=f(ab)
- 显然有 f ( 1 ) = 1 f(1) = 1f(1)=1
- 欧拉函数 φ ( n ) = ∑ i = 1 n [ g c d ( i , n ) = 1 ] φ(n) = \sum_{i=1}^n[gcd(i,n)=1]φ(n)=∑i=1n[gcd(i,n)=1]
- 莫比乌斯函数 μ ( n ) = ( − 1 ) k o r 0 μ(n) = (-1)^kor0μ(n)=(−1)kor0
- 元函数 e ( n ) = [ n = 1 ] e(n) = [n=1]e(n)=[n=1]
- 恒等函数 1 ( n ) = 1 1 (n) = 11(n)=1
- 幂函数 i d k ( n ) = n k id^k(n) = n^kidk(n)=nk
- 除数函数 σ k ( n ) = ∑ d ∣ n d k \sigma_k(n) = \sum_{d|n}d^kσk(n)=∑d∣ndk
线性筛 or 欧拉筛
- 回忆小学就讲过的筛法 O ( n l o g n ) O(n log n)O(nlogn),在其过程中,每个数都被其因子访问一遍
- 在其过程中,每个数都被其因子访问一遍,每个数只被访问了 1 11 次,所以 O ( n ) O(n)O(n)
- 利用线性筛可以求出积性函数的值,考虑 f ( p n ) f(p^n)f(pn) 与 f ( p n − 1 ) f(p^{n-1})f(pn−1) 之间的关系
C o d e : Code:Code:
if (i % pri[j] == 0)
{
miu[i * pri[j]] = 0;
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else
{
miu[i * pri[j]] = -miu[i];
phi[i * pri[j]] = phi[i] * (pri[j]-1);
}
- 在计算过程中可以引入辅助数组
- d dd 表示因子个数, c cc 表示最小因子指数
C o d e : Code:Code:
if (i % pri[j] == 0)
{
c[i * pri[j]] = c[i] + 1;
d[i * pri[j]] = d[i] / (c[i] + 1) * (c[i] + 2);
break;
}
else
{
c[i * pri[j]] = 1;
d[i * pri[j]] = d[i] * 2;
}
狄利克雷卷积
- 定义数论函数之间的运算,( f ∗ g ) ( n ) = ∑ i j = n f ( i ) g ( j ) (f*g)(n)=\sum_{ij=n}f(i)g(j)(f∗g)(n)=∑ij=nf(i)g(j)
- 具有 交换律 结合律
- 对于两个已知值的数论函数进行狄利克雷卷积,考虑 O ( n l o g n ) O(n log n)O(nlogn) 的筛法,将 n nn 的每个因子对其贡献累计上去即可。
- 使用线性筛计算 f = μ ∗ μ f = \mu ∗ \muf=μ∗μ
C o d e : Code:Code:
if (i % pri[j] == 0)
{
miu[i * pri[j]] = 0;
m[i * pri[j]] = i / pri[j] % pri[j] == 0 ? 0 : m[i / pri[j]];
break;
}
else
{
miu[i * pri[j]] = -miu[i];
m[i * pri[j]] = -2 * m[i];
}
- 使用线性筛计算 f = μ ∗ φ f = \mu ∗ \varphif=μ∗φ
if (i % pri[j] == 0)
{
mp[i * pri[j]] = i / pri[j] % pri[j] == 0 ? mp[i] * pri[j] : mp[i / pri[j]] * (pri[j] - 1) * (pri[j] - 1);
break;
}
else
{
mp[i * pri[j]] = mp[i] * (pri[j] - 2);
}
杜教筛
对于积性函数 f ( n ) f(n)f(n) 和较大的 n ≥ 1 0 8 n ≥ 10^8n≥108 我们很难线性计算 S ( n ) = ∑ i = 1 n f ( n ) S(n) = \sum_{i=1}^nf(n)S(n)=∑i=1nf(n)
找一个 g ( n ) g(n)g(n) 使得 ∑ ( f ∗ g ) ( n ) \sum(f*g)(n)∑(f∗g)(n) 尽量好算
∑ k = 1 n ∑ i j = k g ( i ) f ( j ) = ∑ i = 1 n ∑ j = 1 n i g ( i ) f ( j ) = ∑ i = 1 n g ( i ) S ( n i ) \sum_{k=1}^n\sum_{ij=k}g(i)f(j) = \sum_{i=1}^n\sum_{j=1}^{\frac{n}{i}}g(i)f(j)=\sum_{i=1}^{n}g(i) S(\frac{n}{i})∑k=1n∑ij=kg(i)f(j)=∑i=1n∑j=1ing(i)f(j)=∑i=1ng(i)S(in)数论分块 + 记忆化
g ( 1 ) S ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ i = 2 n g ( 1 ) S ( n i ) g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(1)S(\frac{n}{i})g(1)S(n)=∑i=1n(f∗g)(i)−∑i=2ng(1)S(in)假设对 g ( n ) g(n)g(n) 和 ( f ∗ g ) ( n ) (f*g)(n)(f∗g)(n) 的求和线性,直接使用杜教筛 T ( n ) O ( n 3 / 4 ) T(n) ~O(n^{3/4})T(n) O(n3/4),先线性筛前 O ( n 2 / 3 ) O(n^{2/3})O(n2/3) 项则 T ( n ) O ( n 2 / 3 ) T(n) ~O(n^{2/3})T(n) O(n2/3)
M ( n ) = ∑ i = 1 n μ ( i ) = 1 − ∑ i = 2 n M ( n i ) M(n)=\sum_{i=1}^n\mu(i) = 1-\sum_{i=2}^nM(\frac{n}{i})M(n)=∑i=1nμ(i)=1−∑i=2nM(in)
ϕ ( n ) = ∑ i = 1 n ϕ ( i ) = n ( n + 1 ) 2 − ∑ i = 2 n ϕ ( n i ) \phi (n) = \sum_{i=1}^n\phi (i)=\frac{n(n+1)}{2}-\sum_{i=2}^n\phi(\frac{n}{i})ϕ(n)=∑i=1nϕ(i)=2n(n+1)−∑i=2nϕ(in)
B ( n ) = ∑ i = 1 n φ ( i ) = n ( n + 1 ) ( 2 n + 1 ) 6 − ∑ i = 2 n i B ( n i ) B(n)=\sum_{i=1}^n\varphi(i)=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niB(\frac{n}{i})B(n)=∑i=1nφ(i)=6n(n+1)(2n+1)−∑i=2niB(in)
目前就接触了这些,以后又新的再去补充。