数学知识
数学知识
位运算
比较简单,大体分为与或非和异或
集合
有关集合,可以表示为一个二进制的数字,$ 1 $ 表示选,反之不选
全集 U = (1 << n) - 1;
交集 U = a & b;
并集 U = a | b;
补集 U = ~ ;
遍历 for (int i = 0; i <= U; ++ i);
高精度
不是特别想写
快速幂和龟速乘
比较容易理解
快速幂就是二进制拆分,把指数拆分,把 $ O(b) $ 的复杂度优化到 $ O(\log b) $
inline int ksm1 (int a, int b, int mod) {
int res = 1, base = a % mod;
for (; b; b >>= 1, base *= base, base %= mod) if (b & 1) res *= base, res %= mod;
return res;
}
inline int ksm2 (int a, int b, int mod) {
int t = ksm2 (a, b / 2, mod);
t *= t, t %= mod;
if (b & 1) t *= a, t %= mod;
return t;
}
龟速乘用于防止溢出
inline int Turt (int a, int b, int mod) {
int res = 0, base = a;
for (; b; b >>= 1, base += base, base %= mod) res += base, res %= mod;
return res;
}
置换
考虑定义置换为,对于一个集合,每一个数都映射到本数组另一个数,即一个集合到自身的双射,即对于一个置换:
\[ f = \begin{pmatrix} a_1, a_2, \dots, a_n \\
a_{p_1}, a_{p_2}, \dots, a_{p_n} \end{pmatrix} \]
定义两个置换的乘法为:
\[ f = \begin{pmatrix} a_1, a_2, \dots, a_n \\
a_{p_1}, a_{p_2}, \dots, a_{p_n} \end{pmatrix},
g = \begin{pmatrix} a_{p_1}, a_{p_2}, \dots, a_{p_n} \\
a_{q_1}, a_{q_2}, \dots, a_{q_n} \end{pmatrix},
g \circ f = \begin{pmatrix} a_1, a_2, \dots, a_n \\
a_{q_1}, a_{q_2}, \dots, a_{q_n} \end{pmatrix} \]
即先经过 $ f $ 的映射,再经过 $ g $ 的映射