数学知识

数学知识

位运算

比较简单,大体分为与或非和异或

集合

有关集合,可以表示为一个二进制的数字,$ 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 $ 的映射

posted @ 2024-05-23 13:16  __Tzf  阅读(5)  评论(0编辑  收藏  举报