数论基础

1 同余

\(a,b\) 为两个整数,且它们的差 \(a-b\) 能被某个自然数 \(m\) 所整除,则称 \(a\) 就模 \(m\) 来说同余于 \(b\),或者说 \(a\)\(b\) 关于模 \(m\) 同余,记为:\(a \equiv b\pmod m\)。它意味着:\(a-b=m\times k\)\(k\) 为某一个整数)。

例如\(32\equiv 2\pmod 5\),此时 \(k\)\(6\)

对于整数 \(a,b,c\) 和自然数 \(m,n\),对模 \(m\) 同余具有以下一些性质:

  1. 自反性:\(a\equiv a\pmod m\)

  2. 对称性:若 \(a\equiv b\pmod m\),则 \(b\equiv a\pmod m)\)

  3. 传递性:若 \(a\equiv b\pmod m,b\equiv c\pmod m\),则 \(a\equiv c\pmod m\)

  4. 同加性:若 \(a\equiv b\pmod m\),则 \(a+c \equiv b+c\pmod m\)

  5. 同乘性:若 \(a\equiv b\pmod m\),则 \(a*c\equiv b*c\pmod m\)

    \(a\equiv b\pmod m, c\equiv d\pmod m\),则 \(a*c\equiv b*d\pmod m\)

  6. 不满足同除性,但是若 \(gcd(c,m)=1\),则当 \(a\times c\equiv b\times c\pmod m\)时,有 \(a\equiv b\pmod m\)

  7. 同幂性:若 \(a\equiv b\pmod m\),则 \(a^n\equiv b^n\pmod m\)

  8. 推论1:\(a*b(mod\ k)=(a\ mod\ k)*(b\ mod\ k)mod\ k\)

  9. 推论2:若 \(p,q\) 互质,\(a\ mod\ p=x,a\ mod\ q=x\),则 \(a\ mod\ (p*q)=x\)


    证明:

    因为 \(p,q\) 互质,\(a\ mod\ p=x,a\ mod\ q=x\)

    所以一定存在整数 \(s,t\),使得 \(a=s*p+x,a=t*q+x\)

    所以 \(s*p=t*q\)

    又因为 \(t\) 为整数,\(p,q\) 互质,将 \(q\) 移到左边来看

    \(q|s\),即存在整数 \(r\),使得 \(s=r*q\)

    所以 \(a=r*q*p+x\),即 \(a\ mod\ (p*q)=x\)


1.1 例题

这个就没什么例题了,记住就行了

2 素数

2.1 素数的定义

一个大于 \(1\) 的自然数,除了 \(1\) 和它自身外,不能被其他自然数整除的数叫做素数或质数

注意:

  • 1 既不是素数也不是合数;

  • 2 是最小的素数,也是唯一的偶素数;

  • 素数的个数是无限的(可以用反证法证明):


    • 证明:

      假设素数是有限的,假设素数只有有限的 \(n\) 个,最大的一个素数是 \(p\)。设 \(q\) 为所有素数之积加上 \(1\),即 \(q=(2×3×5×…×p)+1\) 不是素数。那么,\(q\) 可以被 \(2、3、…、p\) 中的若干个数整除(因为合数一定可以分解成若干质因子的乘积)。而 \(q\) 被这 \(2、3、…、p\) 中任意一个整除都会余1,与之矛盾。所以,素数是无限的。


2.2 有关素数的一个定理

2.2.1 算术基本定理(唯一分解定理)

任何一个大于 \(1\) 的正整数都能被唯一分解为有限个素数的乘积,可写作:

\(N=p_1^{c_1}p_2^{c_2}p_3^{c_3}\cdots p_m^{c_m}\)

其中 \(c_i\) 都是正整数\(p_i\) 都是素数且满足 \(p_1<p_2<p_3 \cdots <p_m\)

例题:《Hankson 的趣味题》

2.3 单个素数的判定

单个素数判定复杂度是 \(O (\sqrt n)\)

bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = int(sqrt(x+0.5)); i >= 2; --i) {
        if (x % i == 0) return false;
    }
    return true;
}

2.4 筛素数

对于求出某个范围内的所有素数,我们可以从 \(2\) 开始,将 \(2\) 的所有倍数都去掉,剩下的第一个未被去掉的数 \(3\) 为第二个素数。再讲 \(3\) 的所有的倍数去掉,以此来推……我们可以筛选出 \(n\) 以内的所有的素数。

但是这种方法会造成重复筛除合数,影响效率。比如 \(n=30\),在 \(i=2\) 的时候,\(k=2 \times 15\) 筛了一次;在 \(i=3\) 的时候,\(k=3 \times 10\),筛了一次;在 \(i=5\) 的时候,\(k=5 \times 6\) 又筛了一次。因此也就有了“快速线性筛法”。

2.4.1 线性筛

每个合数只被它最小的质因子筛掉。时间复杂度为 \(O(n)\)

int prime[MAXN]; // 保存素数
bool is_not_prime[MAXN] = {1, 1}; // 0和1都不是素数

// 筛选 n 以内的所有素数
void xxs(int n) {
    for (int i = 2; i <= n; ++i) {
        if (!is_not_prime[i]) { // 如果i是素数
            prime[++prime[0]] = i;
        }
        for (int j = 1; j <= prime[0] && i * prime[j] <= n; ++j) {
            is_not_prime[i*prime[j]] = 1;
            // 如果i中包含了该质因子,则停止
            if (i % prime[j] == 0) break;
        }
    }
}

上面代码中的 if (i % prime[j] == 0) break;用来控制每个合数只被筛掉一次。

直观的举个例子:\(i=2 \times 3 \times 5\),此时能筛除 \(2 \times i\),不能筛除 \(3 \times i\)。如果此时筛除 \(3 \times i\) 的话,当 \(i' = 3 \times 3 \times 5\) 时,筛除 \(2 \times i'\) 就和前面重复筛了。也就是说,如果 \(i \mod prime[j] == 0\),说明 \(i\) 自身有一个最小的质因子 \(prime[j]\),根据线性筛的原理,到此终止即可。

2.5 欧拉函数

2.5.1 定义

  • 对于正整数 \(n\),其欧拉函数是指小于等于 \(n\) 的数中与 \(n\) 互质的数的个数,用字母 \(\varphi\) 表示。
  • 通项公式为:$$\varphi(n)=n \times \prod_{i=1}^k (1-\frac{1}{p_i})$$, 其中 \(p_1, p_2, \dots ,p_k\)\(n\) 的所有质因数,\(n\) 为正整数。
  • 例如:\(\varphi(12)=4\),即 \(12\) 以内与 \(12\) 互质的数的个数为 \(4\),有 \(1, 5, 7, 11\)
  • 利用通项公式计算:$$\varphi(12)=12 \times (1-\frac{1}{2}) \times (1-\frac{1}{3})=4$$ (因为 \(12\) 的不同的质因数只有 \(2, 3\))。

2.5.2 性质

  1. \(\varphi (1) = 1\)
  2. \(p\) 是一个素数,则 \(\varphi(p)=p-1\)
  3. \(p\) 是一个素数,则 \(\varphi(p^k)=(p-1) \times p^{k-1}\)
  4. 欧拉函数为积性函数:对于任意两个正整数 \(a, b\),且 \(gcd(a,b)=1\),则 \(\varphi(a \times b)=\varphi(a) \times \varphi(b)\)。特别的,对于奇数 \(n\)\(\varphi(2n)=\varphi(n)\)

证明:

  1. 显然成立。
  2. 也很显然。
  3. 对于 \(n=p^k\),比 \(n\) 小的正整数有 \(p^k-1\)个。其中,所有能被 \(p\) 整除的那些数可以表示成 \(p \times t\) 的形式(\(t=1,2,3, \dots, p^{k-1}-1\)),共有 \(p^{k-1}-1\) 个数能被 \(p\) 整除,也就是说这些数不与 \(p^k\) 互质。所以 \(\varphi(p^k)=p^k-1-(p^{k-1}-1)=p^k-p^{k-1}=(p-1) \times p^{k-1}\)
  4. 证明略,需要用到中国剩余定理……

还有一些变形:

  1. \(p\) 为素数,若 \(n \% p = 0\),则 \(\varphi(n \times p)=p \times \varphi(n)\)。(这条一些资料都要求 \(p\) 为素数,但是 \(p\) 不是素数的时候也成立,大家可以自己推一下)。

  2. \(p\) 为素数,若 \(n\%p \ne 0\),则 \(\varphi(n \times p)=(p-1) \times \varphi(n)\)

  3. \(n\) 为奇数时,\(\varphi(2n)=\varphi(n)\)

  4. \(n\) 互质的数都是成对出现的,且每对的和为 \(n\),所以大于 \(2\) 的数的 \(\varphi(n)\) 都为偶数。


    证明:(反证法)

    假设 \(gcd(n, x)=1,x < n, n > 2\),但是 \(gcd(n, n-x)=k(k>1)\),则可以改写成 \(n=a \times k, n-x=b \times k\),那么移项可得 \(x=n-b \times k=a \times k-b \times k = (a-b) \times k\),则 \(gcd(n, x)=gcd(ak,(a-b)k)\),它们至少有一个公约数 \(k\),与假设矛盾。


2.5.3 求欧拉函数

  1. 如果只要求一个数的欧拉函数值,那么直接根据定义,在质因数分解的同时求就好了

    int euler_phi(int n) {
      // 如果存在大于根号n的质因子,至多有一个
      int m = int(sqrt(n + 0.5));
      int ans = n;
      // 跟判定素数很像
      for (int i = 2; i <= m; i++) {
        // 如果i能整除n,则i是n的因子,也会质因子(看下面的while)
        if (n % i == 0) {
          ans = ans / i * (i - 1); // 根据定义计算
          // 根据唯一分解定理,去掉i的幂
          while (n % i == 0) n /= i;
        }
      }
      // 如果最后n>1,则为一个大于根号n的一个质因子
      if (n > 1) ans = ans / n * (n - 1);
      return ans;
    }
    
  2. 如果求 \(1\)\(n\) 的所有欧拉函数值,利用线性筛即可求出

    // 整体框架为线性筛素数的代码,中间根据欧拉函数的性质加了几条语句而已
    int n, phi[N], prime[N], tot;
    bool not_prime[N]; // true表示不是素数,false表示是素数
    void getPhi() {
        int i, j, k;
        phi[1] = 1;
        for (i = 2; i <= n; ++i) {
            if (!not_prime[i]) {
                prime[++tot] = i;
                phi[i] = i-1; // 根据性质2
            }
            for (j = 1; j <= tot; ++j) {
                k = i * prime[j];
                if (k > n) break;
                not_prime[k] = true;
                if (i % prime[j] == 0) { // 变形1
                    phi[k] = prime[j] * phi[i];
                    break;
                } else { // 变形2
                    phi[k] = (prime[j]-1) * phi[i];
                }
            }
        }
    }
    

    例题:POJ 2478

2.6 费马小定理

2.6.1 先科普两个概念:

  1. 剩余类:

    一个整数被正整数 \(n\) 除后,余数有 \(n\) 种情形:\(0,1,2,3,…,n-1\),它们彼此对模 \(n\) 不同余。这表明,每个整数恰与这 \(n\) 个整数中某一个对模 \(n\) 同余。这样一来,按模 \(n\) 是否同余对整数集进行分类,可以将整数集分成 \(n\) 个两两不相交的子集。我们把(所有)对模 \(n\) 同余的整数构成的一个集合叫做模 \(n\) 的一个剩余类

  2. 完全剩余系:

    任取整数 \(n\),那么 \(0,1,…,n-1\)\(n\) 个数称为模 \(n\) 的一个完全剩余系。每个数称为相应剩余类的代表元。最常用的完全剩余系是 \(\{0,1,…,n-1\}\)

2.6.2 费马小定理(要求模数为素数)

\(p\) 为素数,整数 \(a\) 不是 \(p\) 的倍数(即\(\gcd(a,p)=1\),等价吗?),则 \(a^{p-1}\equiv 1(mod\ p)\)

  • 先来证明一个性质:

    设一个素数为 \(p\),我们取一个不为 \(p\) 的倍数的数 \(a\)

    构造一个序列:\(A={1,2,3,\dots ,p-1}\),这个序列有这样一个性质:

    \[\prod_{i=1}^n A_i\equiv\prod_{i=1}^n(A_i\times a)\ (mod\ p) \]


    • 证明:

      因为\(gcd(A_i,p)=1,gcd(A_i\times a,p)=1\)(有疑问吗?)

      又因为每一个 \(A_i\times a\ (mod\ p)\) 都是独一无二的(反证法证明假设存在同余的,如果我还记得就讲一下),且 \(A_i\times a\ (mod\ p)<p\)

      所以每一个 \(A_i\times a\) 都对应一个 \(A_i\)

      \(f=(p-1)!\),则 \(f\equiv a\times A_i\times a\times A_2 \times a\times A_3\times\dots\times A_{p-1}\ (mod\ p)\)

      所以 \(a^{p-1}\times f\equiv f\ (mod\ p)\)

      证毕。


  • 由上面的性质证明中的 \(a^{p-1}\times f\equiv f\ (mod\ p)\),又因为 \(gcd(f,p)=1\),所以 \(a^{p-1}\equiv 1\ (mod\ p)\)。从而证明了费马小定理。

  • 另一个形式:若 \(p\) 为素数,对于任意整数 \(a\),有 \(a^p\equiv a\pmod p\)


    • 证明:

      因为 \(p\) 为质数,所以对于任意整数 \(a\) 只有两种情况:

      \(a\)\(p\) 的倍数时,显然成立;

      \(a\) 不为 \(p\) 的倍数时,则必有 \(\gcd(a,p)=1\),那么费马小定理直接拿来用,有 \(a^{p-1}\equiv 1\ (mod\ p)\)

      由同余的同乘性,显然成立。


2.6.3 欧拉定理

费马小定理是用来阐述在素数模下,指数的同余性质。当模是合数的时,就要应用范围更广的欧拉定理了。

\(gcd(a,m)=1\),则 \(a^{\varphi(m)}\equiv 1\ (mod\ m)\)

特别的,当 \(m\) 为质数时,与费马小定理一致。

证明略吧……

2.6.3 扩展欧拉定理

\[a^b\equiv \begin{cases} a^{b\bmod\varphi(p)}, & \gcd(a,p)=1 \\ a^b, & \gcd(a,p)\neq 1,b<\varphi(p)\pmod p \\ a^{b\bmod\varphi(p)+\varphi(p)}, & \gcd(a,p)\neq 1,b\geq\varphi(p) \end{cases} \]

具体证明可参考 https://oi-wiki.org/math/fermat/

2.6.4 例题

  1. [SPOJ #4141 "Euler Totient Function"Difficulty: CakeWalk]
  2. [UVA #10179 "Irreducible Basic Fractions"Difficulty: Easy]
  3. [UVA #10299 "Relatives"Difficulty: Easy]
  4. [UVA #11327 "Enumerating Rational Numbers"Difficulty: Medium]
  5. [TIMUS #1673 "Admission to Exam"Difficulty: High]

3 最大公约数

一组数的公约数,是指同时是这组数中每一个数的约数的数。而最大公约数,则是指所有公约数里面最大的一个,常缩写为 gcd(Greatest Common Divisor)。

求 gcd 常用的方法为辗转相除法(欧几里得算法),还有一种为更相减损法

3.1 辗转相除法

3.1.1 辗转相除法用来求两个数的最大公约数

其原理为:\(\gcd(x, y)=\gcd(y, x \% y)\)

// 递归形式
int gcd(int x, int y) {
    return (y == 0 ? x : gcd(y, x%y));
}

// 非递归形式
int gcd(int x, int y) {
    int r = x % y; // 取余数
    while (r) { // 余数不为0,交换变量,继续做除法
        x = y;
        y = r;
        r = x % y;
    }
    return y; // 余数为0时,除数为gcd
}

证明:(证明 \(x,\,y\) 的公约数都是 \(y,\,x\%y\) 的公约数,反过来再证明 \(y,\,x\%y\) 的公约数都是 \(x,\,y\) 的公约数)


3.1.2 多个数的最大公约数

怎么求多个数的最大公约数呢?

显然答案一定是每个数的约数,那么也一定是每相邻两个数的约数。我们每次取出两个数求出答案后再放回去,直到取完所有的数即可。

3.1.3 最小公倍数

对于两个整数 \(a\)\(b\),我们根据唯一分解定f理将其表示出来。

可以看出,最小公倍数 \(lcm(a,b)\) 与最大公约数 \(gcd(a,b)\) 的乘积正好为 \(a \times b\),即:\(gcd(a,b) \times lcm(a,b)=a \times b\)

所以我们可以先求两者的最大公约数,就能方便得出最小公倍数了。

3.1.3 多个数的最小公倍数

可以发现,当我们求出两个数的 \(gcd\) 时,求最小公倍数是 \(O(1)\) 的复杂度。

那么对于多个数,我们其实没有必要求一个共同的最大公约数再去处理。类似于求多个数的最大公约数,我们可以先算出两个数的最小公倍数,放入原序列,继续与第三个数求最小公倍数,以此类推即可。

3.2 裴蜀定理

3.2.1 定义

裴蜀定理,又称贝祖定理、贝祖等式。是一个关于最大公约数的定理。

其内容是:

\(a\), \(b\) 是不全为零的整数,对任意整数 \(x\), \(y\),满足 \(\gcd(a,b)\mid ax+by\),且存在整数 \(x\), \(y\), 使得 \(ax+by=\gcd(a,b)\)

3.2.2 逆定理

\(a\), \(b\) 是不全为零的整数,若 \(d > 0\)\(a\), \(b\) 的公因数,且存在整数 \(x\), \(y\), 使得 \(ax+by=d\),则 \(d = \gcd(a, b)\)

特殊地,设 \(a\), \(b\) 是不全为零的整数,若存在整数 \(x\), \(y\), 使得 \(ax+by=1\),则 \(a\), \(b\) 互质。

3.3 扩展欧几里得

扩展欧几里德定理(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=\gcd(a,b)\) 的一组整数解(这里 \(x,y\) 为未知数)。

证明略讲一下打打酱油……


\(ax_1+by_1=gcd(a,b)\)

\(bx_2+(a\%b)y_2=gcd(b,a\%b)\)

\(\because gcd(a,b)=gcd(b,a \% b)\)

\(\therefore ax_1+by_1=bx_2+(a\%b)y_2\)

\(\because a\%b=a-\lfloor \frac{a}{b} \rfloor \times b\)

\(\therefore ax_1+by_1=bx_2+(a-\lfloor \frac{a}{b} \rfloor \times b)y_2=ay_2+b(x_2-\lfloor\frac{a}{b}\rfloor y_2)\)

因为系数相同,所以我们可以让 \(x_1=y_2, y_1=x_2-\lfloor\frac{a}{b}\rfloor y_2\)


// 该函数求解 ax+by=gcd(a,b) 的整数解
int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a; // a为最大公约数
    }
    // 下面的x、y交换是很直观的根据推到式子来的
    int ret = exgcd(b, a%b, x, y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return ret;
}

可以证明,扩展欧几里得求出的一组整数解满足 \(|x|\le b,\, |y|\le a\)

3.3.1 求通解和最小正整数解

设我们求出的一组整数解为 \((x_0,y_0)\),我们可以用它表示出方程 \(ax+by=gcd(a,b)\) 的通解为:

\[\begin{cases} x=x_0+\frac{b}{gcd(a,b)}\times t\\ y=y_0-\frac{a}{gcd(a,b)}\times t \end{cases} \]

其中 \(t\) 为任意整数。

推导过程:

\(ax+by=gcd(a,b)\tag{1}\)

\(ax_0+by_0=gcd(a,b)\tag{2}\)

\((1)-(2)\) 得:

\(a(x-x_0) + b(y-y_0) = 0\)

两边同除以 \(gcd(a,b)\),得 \(\frac{a}{gcd(a,b)}(x-x_0) + \frac{b}{gcd(a,b)}(y-y_0) = 0\)

其中 \(\frac{a}{gcd(a,b)}\)\(\frac{b}{gcd(a,b)}\) 互质

所以令 \(x-x_0=\frac{b}{gcd(a,b)}\times t;\;y_0-y=\frac{a}{gcd(a,b)}\times t\)

整理得上述通解表示形式。

如果要求 \(x\)\(y\) 的最小正整数解,只需按照通解推导一下就可以得出。

3.4 例题

4 乘法逆元

乘法逆元是模意义下的乘法运算的逆元,应用比较广泛。

4.1 定义

\(a\times x\equiv 1\pmod b\),则称 \(x\)\(a\) 在模 \(b\) 意义下的乘法逆元,记为 \(a^{-1}\)

注意:并非所有的情况下都存在乘法逆元,但是当 \(\gcd(a,b)=1\),即 \(a,b\) 互质时,存在乘法逆元。

4.2 逆元是干什么的

首先对于除法取模不成立,即 \((a\div b)\% p\neq((a\% p)\div (b\%p))\%p\)

显然数学家们是不能忍受这种局面的,他们扔出了“逆元”来解决这个问题。


因为取模运算对于乘法来说是成立的,逆元就是把除法取模运算转化为乘法取模运算。

\[(a/b)\% p=m\tag{1} \]

假设存在一个数 \(x\) 满足

\[a\times x\%p=m\tag{2} \]

由模运算对乘法成立,对 \((1)\) 式两边同时乘以 \(b\) ,得到:

\[a\% p=m\times (b\% p)\% p; \]

如果 \(a\)\(b\) 均小于模数 \(p\) 的话,上式可以改写为:

\[a=m\times b\% p \]

等式两边再同时乘以 \(x\),联立 \((2)\) 式比较得到:

\[a\times x\% p=m\% p=x\times m\times b\% p \]

因此可以得到:

\[b\times x\% p=1 \]

可以看出 \(x\)\(b\) 在模 \(p\) 意义下的逆元。


由以上过程我们看到,求取 \((a/b)\%p\) 等同于求取 \(a\times b^{-1}\%p\)。 因此,求模运算的除法问题就转化为求一个数的逆元问题了。

4.3 如何求乘法逆元

求一个数的逆元,有两种方法。

4.3.1 费马小定理求逆元

因为我们可能会遇到模数为一个素数 \(p\),所以可以利用费马小定理来求。

例如:求整数 \(a\) 在模 \(p\) 意义下的逆元,如果 \(a\)\(p\) 的倍数,显然不存在;如果 \(a\) 不是 \(p\) 的倍数,由 \(a^{p-1}\equiv 1\pmod p\),即 \(a^{p-1}\%p=a\times a^{p-2}\%p=1\)

所以 \(a^{p-2}\% p\) 即为 \(a\) 在模 \(p\) 意义下的逆元,用快速幂求解即可。

typedef long long ll;
ll quickpow(ll a, ll n, ll p) { //快速幂求 a^n % p
    ll ans = 1;
    while(n) {
        if(n & 1) ans = ans * a % p;
        a = a * a % p;
        n >>= 1;
    }
    return ans;
}

ll niyuan(ll a, ll p) { //费马小定理求逆元 a^(p-2)%p
    return quickpow(a, p - 2, p);
}

注意:该方法的前提条件:模数为素数,且 \(a\) 不是 \(p\) 的倍数。

4.3.2 欧拉定理求逆元

当模数不是素数时,我们可以用欧拉定理来求解,再回顾一下欧拉定理:若 \(\gcd(a, n)=1\),则\(a^{\varphi(n)}\equiv 1\pmod n\)。那么 \(a^{\varphi(n)-1}\) 即为 \(a\) 在模 \(n\) 意义下的逆元,快速幂搞它。代码就略过吧……

4.3.3 扩展欧几里得求逆元

根据逆元的定义,若 \(a\times x\equiv 1\pmod b\),则称 \(x\)\(a\) 在模 \(b\) 意义下的乘法逆元。那么,我们可以把原式转换成 \(a\times x=b\times y+1\),移项得:\(a\times x-b\times y=1\),因为 \(y\) 为商,可以变个符号,让原式变为 \(a\times x+b\times y=1\),这就变成了我们熟悉的形式。我们知道,当 \(gcd(a,b)=1\) 时,方程才有整数解,因此,利用扩展欧几里得求逆元,要求 \(a,b\) 互质。

// ax+by=1
int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a; // a为最大公约数
    }
    // 注意传参及下面的计算
    int ret = exgcd(b, a%b, y, x);
    y -= a/b*x;
    return ret;
}

// ax+by=1
int exgcd2(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a; // a为最大公约数
    }
    // 下面的x、y交换是很直观的根据推到式子来的
    int ret = exgcd2(b, a%b, x, y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return ret;
}

4.3.3 线性求逆元

要求 \(1,2,\dots,p-1\) 中每个数关于 \(p\) 的逆元(\(p\) 为素数),用以上两种方法,就显得有点慢了,下面讲一下线性求逆元。

过程推到:

首先,\(1^{-1}\equiv 1\pmod p\),显然成立。

\(p=k\times i+r\),其中 \(1<i<p,\,r<i\)

再放到模 \(p\) 意义下,则有:\(k\times i+r\equiv 0\pmod p\)

两边同时乘以 \(i^{-1}\times r^{-1}\),则:

\[\begin{aligned} k\times i\times i^{-1}\times r^{-1}+r\times i^{-1}\times r^{-1} &\equiv 0 &\pmod p\\ k\times r^{-1}+i^{-1} &\equiv 0 &\pmod p\\ i^{-1} &\equiv -k\times r^{-1} &\pmod p\\ i^{-1} &\equiv -\lfloor\frac{p}{i}\rfloor\times r^{-1} &\pmod p\\ i^{-1} &\equiv -\lfloor\frac{p}{i}\rfloor\times (p\bmod i)^{-1} &\pmod p \end{aligned} \]

所以,我们可以用以上递推式来求解逆元,代码很简单。

ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)-(p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}

但是有时候上面的方法会得到负数,而我们往往需要的是不大于 \(p\) 的正整数,所以可以做一下改动:

// 因为 1<i<p,所以 p/i 一定小于 p
ny[1] = 1;
for (int i = 2; i < p; ++i) {
    ny[i] = (long long)(p - p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}

注意:求逆元往往涉及大量的乘法,所以运算的时候一定要注意是否需要用到 long long。

4.3.4 小结

求解方程 \(ax\equiv 1\pmod p\) 的方法。

方法 限定条件 时间复杂度 备注
费马小定理 模数为素数 \(O(\log n)\)
欧拉定理 \(a\)\(p\) 互质 差不多是 \(O(\sqrt n)\)
扩展欧几里得 \(a\)\(p\) 互质 据说为 \(O(\ln n)\) 可以在求解过程中判断是否互质
线性递推 模数为素数 \(O(n)\)

5 中国剩余定理(CRT)

5.1 算法简介

中国剩余定理 (Chinese Remainder Theorem, CRT) 可求解如下形式的一元线性同余方程组(其中 \(n_1,n_2,\cdots,n_k\) 两两互质):

\[\begin{cases} x\equiv a_1\pmod {n_1}\\ x\equiv a_2\pmod {n_2}\\ \vdots\\ x\equiv a_k\pmod {n_k}\\ \end{cases} \]

下面的「物不知数」问题就是一元线性同余方程组的一个实例。

5.1.1 「物不知数」问题

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

即求满足以下条件的整数:除以 \(3\)\(2\),除以 \(5\)\(3\),除以 \(7\)\(2\)

该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

\(2\times 70+3\times 21+2\times 15=233=2\times 105+23\),故答案为 \(23\)

5.2 算法流程

  1. 计算所有模数的乘积 \(n\)
  2. 对于第 \(i\) 个方程:
    a. 计算 \(m_i=\frac{n}{n_i}\)
    b. 计算 \(m_i\) 在模 \(n_i\) 意义下的逆元 \(m_i^{-1}\)
    c. 计算 \(c_i=m_i\times m_i^{-1}\)(不要对 \(n_i\) 取模)。
  3. 方程组在模 \(n\) 意义下的唯一解为:\(x=\sum_{i=1}^ka_ic_i\bmod n\)

5.3 参考代码

LL CRT(int k, LL a[], LL r[]) {
  LL n = 1, ans = 0;
  for (int i = 1; i <= k; i++) n = n * r[i];
  for (int i = 1; i <= k; i++) {
    LL m = n / r[i], b, y;
    exgcd(m, r[i], b, y);  // b * m mod r[i] = 1
    ans = (ans + a[i] * m * b % n) % n;
  }
  return (ans % n + n) % n;
}

5.4 算法证明

我们需要证明上面算法计算所得的 \(x\) 对于任意 \(i=1,2,\cdots,k\) 满足 \(x\equiv a_i\pmod {n_i}\)

\(\because m_i=\frac{n}{n_i}\)
\(\therefore\)\(i\ne j\) 时,\(m_j\) 包含因子 \(n_i\),有 \(m_j\equiv 0\pmod {n_i}\),故 \(c_j\equiv m_j\equiv 0\pmod {n_i}\)。所以我们有:

\[\begin{align} x &\equiv \sum_{j=1}^ka_jc_j\pmod {n_i}\nonumber\\ &\equiv a_ic_i\pmod {n_i}\nonumber\\ &\equiv a_i\cdot(m_i\cdot m_i^{-1})\pmod {n_i}\nonumber\\ &\equiv a_i\pmod {n_i}\nonumber \end{align} \]

即对于任意 \(i=1,2,\cdots k,\),上面算法得到的 \(x\) 总是满足 \(x\equiv a_i\pmod {n_i}\),即证明了解同余方程组的算法的正确性。

因为我们没有对输入的 \(a_i\) 作特殊限制,所以任何一组输入 \(\{a_i\}\) 都对应一个解 。

另外,若 \(x\ne y\),则总存在 \(i\) 使得 \(x\)\(y\) 在模 \(n_i\) 下不同余。(假设存在这样一个 \(y\),使得 \(x\equiv y\pmod{n_i}\),由于任意两个模数是互质的,由同佘的性质,则有 \(x\equiv y\pmod n\),即 \(y-x=z\dot n\),其中 \(z\) 为整数,又因为 \(x\neq y\),所以在\(n\) 意义下有唯一解。)

故系数列表 \(\{a_i\}\) 与解 \(x\) 之间是一一映射关系,方程组总是有唯一解。

5.5 「物不知数」问题解法

  1. \(n=n_1\times n_2\times n_3=3\times 5\times 7 = 105\)
  2. 计算 \(c_i\)
    a. \(m_1=\frac{n}{n_1}=105/3=35\)\(m_1\) 关于 \(n_1\) 的逆元 \(m_1^{-1}=2\)\(c_1=m_1\times m_1^{-1}=35*2=70\)
    b. \(m_2=\frac{n}{n_2}=105/5=21\)\(m_2\) 关于 \(n_2\) 的逆元 \(m_2^{-1}=1\)\(c_2=m_2\times m_2^{-1}=21*1=21\)
    c. \(m_3=\frac{n}{n_3}=105/7=15\)\(m_3\) 关于 \(n_3\) 的逆元 \(m_3^{-1}=1\)\(c_3=m_3\times m_3^{-1}=15*1=15\)
  3. \(x = \sum_{i=1}^3 a_ic_i\bmod n=(2\times 70+3\times 21+2\times 15)\bmod 105=233\bmod 105=23\)

6 卢卡斯定理(Lucas)

6.1 用途

Lucas 定理用于求解大组合数取模的问题,其中模数必须为素数。
正常的组合数 \(C(n, m)\) 运算,当 \(n\) 比较小的时候,可以通过递推公式求解。
\(n\) 很大,模数 \(p\) 为质数,且 \(n < p\) 时,此时可以利用乘法逆元来解决问题。
但是当模数是一个不大的质数的时候,即 \(n > p\) 时,公式中某个分母上某个数可能不存在逆元(比如分母上某个数是 \(p\) 的倍数),此时就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理。

6.2 求解方式

对于质数 \(p\),有

\[C_n^m \equiv C_{\lfloor n/p\rfloor}^{\lfloor m/p\rfloor}\cdot C_{n\bmod p}^{m\bmod p} \pmod p \]

上式中,\(n\bmod p\)\(m\bmod p\) 一定小于 \(p\),可以直接求解(注意 \(n\bmod p < m\bmod p\) 时,组合数为 \(0\)),\(C_{\lfloor n/p\rfloor}^{\lfloor m/p\rfloor}\) 可以继续用 Lucas 定理求解。这也就要求 \(p\) 的范围不能够太大,一般在 \(10^5\) 左右。边界条件:当 \(m=0\) 的时候,返回 1。
时间复杂度为 \(O(f(n)+g(n)log_p(n))\),其中 \(f(n)\) 为预处理组合数的复杂度,\(g(n)\) 为单次求组合数的复杂度。

对于上述求解的方式,我们可以用下面的方式来理解一下。

1 将 \(n\)\(m\) 写成 \(p\) 进制的形式:

\(n=a_k\cdot p^k+a_{k-1}\cdot p^{k-1}+...+a_2\cdot p^2+a_1\cdot p_1+a_0\cdot p^0\)
\(m=b_k\cdot p^k+b_{k-1}\cdot p^{k-1}+...+b_2\cdot p^2+b_1\cdot p_1+b_0\cdot p^0\)
即:
\(n=(a_ka_{k-1}...a_2a_1a_0)_p\)
\(m=(b_kb_{k-1}...b_2b_1b_0)_p\)
\(n\)\(m\) 写成位数相同的形式

2 则有 \(C_n^m\equiv C_{a_0}^{b_0}\cdot C_{a_1}^{b_1}\cdot C_{a_2}^{b_2}\cdot...\cdot C_{a_{k-1}}^{b_{k-1}}\cdot C_{a_k}^{b_k}\pmod p\equiv \prod_{i=0}^kC_{a_i}^{b_i}\pmod p\)

3 对比一下,上述的递归式子,每次直接计算的组合数部分就是 \(p\) 进制拆分后对应的每一位。

6.3 参考代码

// 需要先预处理出fact[],即阶乘
ll C(ll n, ll m, ll p) {
    return n < m ? 0 : fact[n] * inv(fact[m], p) % p * inv(fact[n - m], p) % p;
}

ll Lucas(ll n, ll m, ll p) {
  if (m == 0) return 1;
  return (C(n % p, m % p, p) * Lucas(n / p, m / p, p)) % p;
}

6.4 Lucas 定理证明

我们先考虑组合数 \(C_p^m\),有 \(C_p^m=\frac{p!}{m!(p-m)!}\),对分子进行质因子分解,\(p\) 的次数为 \(1\),则当 \(m=0\)\(m=p\) 时,分母中才能分解出质因子 \(p\)
因此有:

\[\tag{6.4.1} C_p^m\equiv \begin{cases} 1, & m = 0 或 m = p\\ 0, & 0<m<p \end{cases} \pmod p \]

我们知道二项式

\[(a+b)^p = \sum_{m=0}^pC_p^ma^mb^{p-m} \]

结合 \((6.4.1)\) 式,我们让两边对 \(p\) 取模,得到

\[\begin{align} (a+b)^p & \equiv \sum_{m=0}^pC_p^ma^mb^{p-m}\pmod p\nonumber\\ & \equiv \sum_{m=1}^p[m=0\cup m=p]\times a^mb^{p-m}\pmod p\nonumber\\ & \equiv a^p+b^p\pmod p\nonumber \end{align} \]

我们令 \(f^p(x) = (ax^n+bx^m)^p\bmod p\),其中 \(gcd(a,p)=1,\,gcd(b, p)=1\),结合费马小定理(下面第二行到第三行推导),则有

\[\begin{align} f^p(x) &\equiv \sum_{k=0}^p C_p^k(ax^n)^k(bx^m)^{p-k}\pmod p\nonumber\\ &\equiv a^px^{np}+b^px^{mp}\pmod p\nonumber\\ &\equiv ax^{np}+bx^{mp}\pmod p\nonumber\\ &\equiv f(x^p)\pmod p\nonumber \end{align} \]

特别的,\((1+x)^p\equiv 1+x^p\pmod p\)

对于二项式 \((1+x)^n\),我们知道 \(C_n^m\) 即为 \(x^m\) 项的系数,利用上面的结论,我们可以得到:

\[(1+x)^n=(1+x)^{p\cdot \lfloor n/p\rfloor}\cdot (1+x)^{n\bmod p} \]

所以有:

\[\begin{align} (1+x)^n\equiv (1+x^p)^{\lfloor n/p\rfloor}\cdot (1+x)^{n\bmod p} \pmod p\tag{6.4.2} \end{align} \]

对于任意正整数 \(n\),都可以写成 \(n=k*p+r\),则
\(k = \lfloor n/p\rfloor\)
\(r = n\bmod p\)
我们在 \((6.4.2)\) 式中考虑一下 \(C_n^m\) 的组成,在 \((6.4.2)\) 式的右边,在乘号的两边我们可以找到唯一的组合与之对应。
因此有

\[C_n^m\equiv C_{\lfloor n/p\rfloor}^{\lfloor m/p\rfloor}\cdot C_{n\bmod p}^{m\bmod p}\pmod p \]

6.5 扩展卢卡斯定理(exLucas)

卢卡斯和扩展卢卡斯都用于求解形如 \(C_n^m\bmod p\) 的答案。

  • \(p\) 是质数时,直接用卢卡斯定理求解即可。
  • \(p\) 不是质数时,需要用到扩展卢卡斯定理求解。

6.5.1 求解思想

  1. 模数转化

由于模数 \(p\) 不是质数,由唯一分解定理

\[p=\prod_{i=1}^rp_i^{a_i} \]

其中,\(r\) 为不质因子的个数,\(p_i\) 为不同的质因子,\(a_i\) 为对应质因子的指数,此时 \(p_i^{a_i}\) 两两互质。我们可以构造如下 \(r\) 个同余方程

\[\begin{cases} C_n^m\equiv b_1\pmod {p_1^{a_1}}\\ C_n^m\equiv b_2\pmod {p_2^{a_2}}\\ \vdots\\ C_n^m\equiv b_r\pmod {p_r^{a_r}}\\ \end{cases} \]

只要我们求出每个 \(b_i\) 的值,就可以用中国剩余定理(crt)来求解最后的答案。

  1. 组合数阶乘的转化

有了第一步的分析,这时,我们要求的是上面同余方程组中的每个 \(b_i\) 的值,也就是 \(C_n^m\bmod {p_i^{a_i}}\) 的结果。

我们把符号简化一些,即求 \(C_n^m\bmod p^a\)(注意,这里的 \(p\) 与原问题中的 \(p\) 不一样,这里只是为了简化符号)。

\(\because C_n^m=\frac{n!}{m!(n-m)!}\)
\(\therefore C_n^m\equiv \frac{n!}{m!(n-m)!}\pmod {p^a}\)

此时显然我们要求出分母上阶乘的逆元。由于此时阶乘与模数很可能不互质,所以极有可能不存在逆元,因此我们要对式子中分子分母的阶乘分别进行拆分。

对于

\[n!=1\times 2\times ...\times (n-1)\times n \]

我们把其中所有 \(p\) 的倍数提到前面,剩余项(不能被 \(p\) 整除的项)放在后面,有:

\[\begin{aligned} n!&=(p\times 2p\times ...\times \lfloor\frac{n}{p}\rfloor p)\times\prod_{p\nmid i}^n i\\ &=(1\times 2\times ...\times\lfloor\frac{n}{p}\rfloor)\times p^{\lfloor\frac{n}{p}\rfloor}\times\prod_{p\nmid i}^n i\\ &=\lfloor\frac{n}{p}\rfloor!\times p^{\lfloor\frac{n}{p}\rfloor}\times\prod_{p\nmid i}^n i \end{aligned}\]

其中,第一部分 \(\lfloor\frac{n}{p}\rfloor!\) 可以递归求解,第二部分 \(p^{\lfloor\frac{n}{p}\rfloor}\) 可以在递归的过程中统计指数,最终用快速幂求解,比较麻烦的是第三部分。

需要注意的是,此时的 \(p^{\lfloor\frac{n}{p}\rfloor}\) 并不一定是原来的阶乘中分离出来的全部的 \(p\) 的幂,因为在递归求解的过程中还有可能存在因数 \(p\),因此在递归的时候统计指数,由于分子分母都有可能包含因数 \(p\),所以在统计完分子分母所有的 \(p\) 的指数后,再用快速幂求解。

例如:计算 \(22!\bmod 9\)
改写成 \(n!\bmod p^a\) 的形式,得到 \(22!\bmod 3^2\),其中 \(n=22,p=3,a=2\)
则有

\[\begin{aligned} 22!&=1\times 2\times 3\times ...\times 20\times 21\times 22\\ &=(3\times 6\times 9\times 12\times 15\times 18\times 21)\times (1\times 2\times 4\times 5\times 7\times 8\times 10\times 11\times 13\times 14\times 16\times 17\times 19\times 20\times 22)\\ &=((1\times 3)\times (2\times 3)\times (3\times 3)\times (4\times 3)\times (5\times 3)\times (6\times 3)\times (7\times 3))\times (1\times 2\times 4\times 5\times 7\times 8\times 10\times 11\times 13\times 14\times 16\times 17\times 19\times 20\times 22)\\ &=(1\times 2\times 3\times 4\times 5\times 6\times 7)\times 3^7\times (1\times 2\times 4\times 5\times 7\times 8\times 10\times 11\times 13\times 14\times 16\times 17\times 19\times 20\times 22)\\ &=7!\times 3^7\times (1\times 2\times 4\times 5\times 7\times 8\times 10\times 11\times 13\times 14\times 16\times 17\times 19\times 20\times 22) \end{aligned} \]

此时,上面式子包含了三部分:

  1. 第一部分为 \(7!\),即 \(\lfloor\frac{n}{p}\rfloor!\),该阶乘里面可能还存在 \(p\) 的倍数
  2. 第二部分为 \(3^7\),即 \(3^{\lfloor\frac{n}{p}\rfloor}\)
  3. 第三部分为 \(n!\) 中与 \(p\) 互质的数的乘积,由于 \(1\equiv 10\pmod{3^2}\)\(2\equiv 11\pmod{3^2}\),依此类推,则有:
    \(1\times 2\times 4\times 5\times 7\times 8\equiv 10\times 11\times 13\times 14\times 16\times 17\pmod{3^2}\)
    显然这一部分里面是存在循环节的,指数为 \(\lfloor\frac{22}{3^2}\rfloor\),即 \(\lfloor\frac{n}{p^a}\rfloor\) 我们只需要暴力求解一下循环节的部分,再利用快速幂即可,而剩下的数的个数是小于 \(3^2\),直接暴力求解即可。

例如 \(22!=7!\times 3^7\times (1\times 2\times 4\times 5\times 7\times 8)^2\times(19\times 20\times 22)\)

因此

\[n!=\lfloor\frac{n}{p}\rfloor!\times p^{\lfloor\frac{n}{p}\rfloor}\times(\prod_{(i,p)=1}^{p^a}i)^{\lfloor\frac{n}{p^a}\rfloor}\times\prod_{(i,p)=1}^{n\bmod {p^a}} i \]

按照之前说的,\(p^{\lfloor\frac{n}{p}\rfloor}\) 这一项我们最后求组合数的时候再计算,这里计算的阶乘是去年这一项的结果。

//p 为质因子,k = p^a
ll fac(ll n, ll p, ll k) {
    if (!n) return 1; //0!=1
    ll ans = 1;
    //处理循环节的部分
    for (int i = 2; i < k; i++) {
        if (i % p) ans = ans * i % k;
    }
    ans = qpow(ans, n / k, k); //求循环节的幂
    //处理剩下的部分
    for (int i = 2; i <= n % k; i++) {
        if (i % p) ans = ans * i % k;
    }
    return ans * fac(n / p, p, k) % k; //递归求解
}

利用上面的方法,对分子分母中的阶乘进行计算,接下来是求组合数,循环处理,分别找出分子分母中包含多少个因子 \(p\)

ll cnt = 0;
for (ll i = p; i <= n; i *= p) cnt += n / i;
for (ll i = p; i <= m; i *= p) cnt -= m / i;
for (ll i = p; i <= n - m; i *= p) cnt -= (n - m) / i;

此时 \(b=C_n^m\bmod p^a=n!\times inv(m!)\times inv((n-m)!)\times p^{cnt}\bmod {p^a}\)

//p 为原模数分解出来的每个质因子
//k=p^x
ll C(ll n, ll m, ll p, ll k) {
    if (n < m) return 0;
    //分别求出分子分母的阶乘
    ll a = fac(n, p, k);
    ll b = fac(m, p, k);
    ll c = fac(n - m, p, k);
    //求出分子分母中包含因子p的个数
    ll cnt = 0;
    for (ll i = p; i <= n; i *= p) cnt += n / i;
    for (ll i = p; i <= m; i *= p) cnt -= m / i;
    for (ll i = p; i <= n - m; i *= p) cnt -= (n - m) / i;
    //求组合数
    return a * inv(b, k) % k * inv(c, k) % k * qpow(p, cnt, k) % k;
}

接下来就是 exLucas 的过程了

  1. 对原模数 \(p\) 进行质因子分解,找到每个 \(p_i^{a_i}\)
  2. 对每个 \(p_i^{a_i}\),都求一遍 \(C_n^m\bmod p_i^{a_i}\),得到每个 \(b_i\)
  3. 用 crt 求解
//mod=pi^(ai),即质因子分解出来的模数
//b=C(n, m)%mod,即每个同余方程的值
//P为原问题的模数,即质因子分解前的模数
ll crt(ll b, ll mod) {
    return b * (P / mod) % P * inv(P / mod, mod) % P;
}

最终代码

ll exlucas() {
    ll t = P, ans = 0;
    //质因子分解
    for (ll i = 2; i * i <= t; i++) {
        if (t % i) continue;
        ll mod = 1; //每次质因子分解得到的模数
        while (t % i == 0) {
            mod *= i;
            t /= i;
        }
        //crt计算答案
        ans = (ans + crt(C(n, m, i, mod), mod)) % P;
    }
    //还剩一个大于sqrt(n)的质因子,指数必然是1
    if (t > 1) {
        ans = (ans + crt(C(n, m, t, t), t)) % P;
    }
    return ans;
}

7 概率

7.1 事件与概率

某些现象,在个别试验中,其结果呈现出不确定性,而在大量重复试验中其结果又具有统计规律性,这些现象成为“随机事件”。

一个试验称为”随机试验“,是指它具有以下 \(3\) 个特点:

  1. 可以在相同的条件下重复进行。
  2. 每次试验的可能结果可以不止一个,并且能事先明确试验的所有可能结果。
  3. 进行一次试验之前不能确定哪一个结果会出现。

某个随机试验所有可能的结果的集合成为样本空间,一般记为 \(S\)\(S\) 的元素即为试验的每个结果,称为样本点。一般都假设 \(S\) 由有限个元素组成,\(S\) 的子集称为随机事件,简称事件。在每次试验中,当且仅当这一子集中的一个样本点出现时,称这一事件发生。例如在一次掷骰子的随机试验中,如果用获得的点数来表示单位事件,那么一共可能出现 \(6\) 个单位事件,则事件空间可以表示为 \(S=\{1,2,3,4,5,6\}\)

随机事件是事件空间 \(S\)子集,它由事件空间 \(S\) 中的单位元素构成,用大写字母 \(A,B,C,\dots\) 表示。例如在掷两个骰子的随机试验中,设随机事件 \(A\) 为“获得的点数和大于 \(10\)”,则 \(A\) 可以由下面 \(3\) 个单位事件组成:\(A=\{(5,6),(6,5),(6,6)\}\)

7.1.1 事件

  1. 基本事件:由一个样本点组成的单个元素的集合,称为基本事件
  2. 必然事件:在某种条件下,一定会发生的事件,叫做相对于该条件的必然事件,简称必然事件,例如掷一个骰子点数小于 \(7\)
  3. 不可能事件:在某种条件下,一定不会发生的事件,叫做相对于该条件的不可能事件,简称不可能事件。例如掷一个骰子点数大于 \(6\)
  4. 随机事件:在某种条件下,可能发生,也可能不发生的事件,叫做相对于该条件的随机事件,简称随机事件。例如掷一个骰子点数为 \(2\)。必然事件与不可能事件统称为相对于条件 \(S\) 的确定事件,简称确定事件。确定事件和随机事件统称为事件,一般用大写字母 \(A,B,C,\dots\) 表示。

7.1.2 频数、频率及概率

  1. 频数和频率:在相同的条件下重复 \(n\) 次试验,观察某一事件 \(A\) 是否发生,称 \(n\) 次试验中事件 \(A\) 出现的次数 \(n_A\) 为事件 \(A\) 的频数,称事件 \(A\) 出现的比例 \(f_n(A)=\frac{n_A}{n}\) 为事件 \(A\) 出现的频率。
  2. 概率:对于给定的随机事件 \(A\),由于事件 \(A\) 发生的频率 \(f_n(A)\) 随着试验次数的增加稳定于某个常数上,把这个常数记作 \(P(A)\),称为事件 \(A\) 的概率。
  3. 概率的意义:
    • 随机事件在一次的试验中发生与否是随机的,但随机性中含有规律性。
    • 概率是频率的稳定值,是一个确定的常数。概率大,并不表示事件一定发生,只是说事件发生的可能性大,但在一次试验中却不一定发生;概率小,并不表示事件一定不会发生,只是说事件发生的可能性小,但在一次试验中却不一定不发生。

7.1.3 事件的关系及运算

名称 定义 符号表示 图形表示
包含关系 如果事件 \(A\) 发生,则事件 \(B\) 一定发生,这时称事件 \(B\) 包含事件 \(A\)(或称事件\(A\) 包含于事件 \(B\) \(B\supseteq A\)(或 \(A\subseteq B\)
相等关系 \(B\supseteq A\)\(B\subseteq A\),那么称事件 \(A\) 与事件 \(B\) 相等 \(A=B\)
并事件(和事件) 若某事件发生当且仅当事件 \(A\) 或事件 \(B\) 发生,则称此事件为事件 \(A\) 与事件 \(B\) 的并事件(或和事件) \(A\bigcup B\)(或 \(A+B\)
交事件(积事件) 若某事件发生当且仅当事件 \(A\) 发生且事件 \(B\) 发生,则称此事件为事件 \(A\) 与事件 \(B\) 的交事件(或积事件) \(A\bigcap B\)(或 \(A\times B\)
互斥事件 \(A\bigcap B\) 为不可能事件,那么称事件 \(A\) 与事件 \(B\) 互斥 \(A\bigcap B=\emptyset\)
对立事件 \(A\bigcap B\) 为不可能事件,且 \(A\bigcup B\) 为必然事件,那么称事件 \(A\) 与事件 \(B\) 互为对立事件 \(A\bigcap B=\emptyset\)
\(P(A\bigcup B)=P(A)+P(B)=1\)

7.1.4 概率的基本性质

  1. 任何事件的概率在 \(0\sim 1\) 之间,即 \(0\le P(A)\le 1\)
  2. 必然事件的概率为 \(1\),不可能事件的概率为 \(0\)
  3. 如果事件 \(A\) 与事件 \(B\) 互斥,则 \(P(A\bigcup B)=P(A)+P(B)\)
  4. 如果事件 \(A\) 与事件 \(B\) 互为对立事件,则 \(A\bigcup B\) 为必然事件,\(P(A\bigcup B)=1,\,P(A)=1-P(B)\)
  5. 互斥事件的可加性:设 \(A_1,A_2,\dots,A_n\) 是互斥的 \(n\) 个事件,则 \(P(A_1\bigcup A_2\bigcup\dots A_n)=P(A-1)+P(A_2)+\dots+P(A_n)\)
  6. 独立事件的可乘性:如果事件 \(A\) 是否发生对事件 \(B\) 发生的概率没有影响,同时事件 \(B\) 是否发生对事件 \(A\) 发生的概率也没有影响,则称 \(A\)\(B\) 是相互独立事件,有 \(P(A\bigcap B)=P(A)\times P(B)\)。推广到 \(n\) 个相互独立事件,\(P(A_1\bigcap A_2\bigcap\dots A_n)=P(A_1)\times P(A_2)\times\dots P(A_n)\)
  7. 条件概率:记 \(P(B|A)\) 表示在事件 \(A\) 已发生的前提下,事件 \(B\) 发生的概率。则 \(P(B|A)=\frac{P(AB)}{P(A)}\),其中 \(P(AB)\) 表示事件 \(A\) 和 事件 \(B\) 同时发生的概率。

7.1.5 定理与公式

  • 乘法公式: \(P(AB)=P(B|A)\cdot P(A)=P(A|B)\cdot P(B)\)
  • 全概率公式:若事件 \(A_1, A_2,\dots,A_n\) 构成一个完备的事件且都有正概率,即 \(\forall i,j,A_i\bigcap A_j=\empty\),且 \(\sum_{i=1}^{n} A_i=1\),有 \(P(B)=\sum_{i=1}^n P(A_i)P(B|A_i)\)
  • 贝叶斯定理:\(P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)}\)

以上公式中,事件 \(B_i\) 的概率为 \(P(B_i)\),在事件 \(B_i\) 已发生的条件下事件 \(A_i\) 的概率为 \(P(A|B_i)\),在事件 \(A\) 发生的条件下事件 \(B_i\) 的概率为 \(P(B_i|A)\)

对上面两个公式的简单理解:
假设学校的奖学金采取申请制度,只有满足一定的条件才可能拿到奖学金,条件如下:

  1. 三好学生,拿到奖学金的概率是 \(0.3\)
  2. 四好学生,拿到奖学金的概率是 \(0.4\)
  3. 五好学生,拿到奖学金的概率是 \(0.5\)
  4. 六好学生,拿到奖学金的概率是 \(0.6\)

这些学生只能是三好四好五好六好学生中的一种,不能跨种类。
另外,这个学校学生是三好学生的概率是 \(P(A_1)=0.4\),四好学生的概率是 \(P(A_2)=0.3\),五好学生的概率是 \(P(A_3)=0.2\),六好学生的概率是 \(P(A_4)=0.1\)
问一个学生能够拿到奖学金的概率是多少?

我们假设事件 \(B\) 表示学生获得奖学金,那么导致一个学生拿到奖学金的情况有:

  1. 这个学生是三好学生,刚好又凭借三好学生申请到了奖学金:\(p_1=P(A_1)\cdot P(B|A_1)=0.4\times 0.3=0.12\)
  2. 这个学生是四好学生,刚好又凭借四好学生申请到了奖学金:\(p_2=P(A_2)\cdot P(B|A_2)=0.3\times 0.4=0.12\)
  3. 这个学生是五好学生,刚好又凭借五好学生申请到了奖学金:\(p_3=P(A_3)\cdot P(B|A_3)=0.2\times 0.5=0.1\)
  4. 这个学生是六好学生,刚好又凭借六好学生申请到了奖学金:\(p_4=P(A_4)\cdot P(B|A_4)=0.1\times 0.6=0.06\)

则由全概率公式得:\(P(B)=\sum P(A_i)\cdot P(B|A_i)=0.12+0.12+0.1+0.06=0.4\)
所以,全概率公式可以理解为:导致一个事件发生的原因有很多种(各种原因互斥),那么这个事件发生的概率就是每种原因引起该事件发生的概率的总和

另一个问题,如果一个学生已经拿到了奖学金,这个学生是三好学生的概率是多少?
由贝叶斯公式得:\(P(A_1|B)=\frac{P(B|A_1)}{\sum P(A_1)\cdot P(B|A_i)}=\frac{0.12}{0.4}=0.3\)
所以,一个事件已经发生了有很多原因都能导致这个事件发生,那么其中一种原因导致该事件发生的概率可以用贝叶斯公式来解决

7.2 古典概率

概率依其计算方法不同,可分为古典概率、试验概率和主观概率。古典概率通常又叫事前概率,是指当随机事件中各种可能发生的结果及其出现的次数都可以由演绎或外推法得知,而无需经过任何统计试验即可计算各种可能发生结果的概率。

人们最早研究概率是从掷硬币、掷骰子和摸球等游戏和赌博中开始的。这类游戏有几个共同特点:

  • 试验的样本空间有限。
    如掷硬币有正反两种结果,掷骰子有 \(6\) 种结果等;

  • 试验中每个结果出现的可能性相同。
    如硬币和骰子是均匀的前提下,掷硬币出现正反的可能性各为 \(\frac{1}{2}\),掷骰子掷出各种点数的可能性各为 \(\frac{1}{6}\)

  • 这些随机现象所能发生的事件是互不相容的。

    比如掷硬币的结果要么是正,要么是反,不可能同时发生。

具有这几个特点的随机试验称为古典概型或等可能概型。计算古典概型概率的方法称为概率的古典定义或古典概率。

在计算古典概率时,如果在全部可能出现的基本事件范围内,构成事件 \(A\) 的基本事件有 \(a\) 个,不构成事件 \(A\) 的事件有 \(b\) 个,则出现事件 \(A\) 的概率为 \(P(A)=\frac{a}{a+b}\)

7.2.1 例题

  1. \(40\) 支圆珠笔中有 \(30\) 支黑色的,另外 \(10\) 支是红色的。从中任意取出 \(4\) 支,计算其中至少有 \(1\) 支红色的概率。

    分析:

    • 直接计算,分成红色的有 \(1\) 支、\(2\) 支、\(3\)支、\(4\)支四个事件,彼此互斥,直接相加
    • 利用对立事件计算
  2. https://vjudge.net/problem/LightOJ-1104(生日悖论)

  3. POJ 3071

7.2 期望

我们先来玩一个游戏:如果有 \(14\) 张牌,其中有 \(1\) 张是 \(A\)。现在我来坐庄,一块钱赌一把,如果你抽中了 \(A\),我赔你 \(10\) 块钱;如果没有抽中,那么你那一块钱就输给我了。你觉得对谁有利?

如果你只玩一把,只有两种可能。但是如果玩上几百几千甚至更多,有的抽中有的不中,你手中的钱是个什么结果呢?

这就是概率上的一个概念——数学期望,它可以理解成某件事情大量发生之后的平均结果

7.2.1 定义

在一定区间内变量取值为有限个,或数值可以一一列举出来的变量称为离散型随机变量。一个离散型随机变量的数学期望是试验中每次可能的结果乘以其结果概率的总和。

上面游戏中,你作为玩家,得到的“数学期望值”是 \(-\frac{3}{14}\)

信息学奥赛中的期望值问题,大多数都是求离散型随机变量的数学期望。如果 \(X\) 是一个离散的随机变量,输出值为 \(x_1,x_2,\dots\),和输出值相应的概率分别为 \(p_1,p_2,\dots\)(概率之和为 \(1\)),那么期望值是 \(E(X)=\sum_i p_i\times x_i\)

7.2.2 性质

  • 期望的“线性”性质

    对于任意随机变量 \(X\)\(Y\) 以及常量 \(a\)\(b\),有:\(E(aX+bY)=aE(X)+bE(Y)\)

    当两个随机变量 \(X\)\(Y\) 相互独立且各自都有一个已定义的期望时,有:\(E(XY)=E(X)E(Y)\)

  • 全期望公式:\(E(Y)=E(E(Y|X))\)

    推导:

    \[\begin{aligned} E(E(Y|X))&=\sum_i P(X=x_i)\times E(Y|X=x_i)\\ &=\sum_i p_{x_i}\times E(Y|X=x_i)\\ &=\sum_i p_{x_i}\times \sum_j y_j\times\frac{p_{x_iy_j}}{p_{x_i}}\\ &=\sum_{i}\sum_{j}p_{x_i}\times y_j\times\frac{p_{x_iy_j}}{p_{x_i}}\\ &=\sum_{i}\sum_{j}y_j\times p_{x_iy_j}\\ &=\sum_{j}y_j\sum_i {p_{x_iy_j}}\\ &=E(Y) \end{aligned} \]

7.2.3 例题

UVA 10529

7.3 方差

离散型方差的一般形式:

\[D(X)=\sum_i (x_i-E(X))^2p_i \]

换种写法:

\[D(X)=E(X-E(X))^2 \]

特别的,当 \(x_i\) 等概率发生时,

\[\begin{aligned} D(X)&=\frac{1}{n}\sum_i (x_i-E(X))^2\\ &=\frac{1}{n}\sum_i (x_i-\overline x)^2 \end{aligned} \]

上面公式中,\(\overline x\) 表示 \(x_i\) 的平均数。

再换种写法:

\[D(X)=E(X^2)-E^2(X) \]

\[\begin{aligned} D(X)&=E(X-E(X))^2\\ &=E(X^2-2X\cdot E(X)+E^2(X))\\ &=E(X^2)-E(2\cdot E(X)\cdot X)+E^2(X)\\ &=E(X^2)-2E(X)\cdot E(X)+E^2(X)\\ &=E(X^2)-E^2(X) \end{aligned} \]

上面第三行中,\(2E(X)\)\(E^2(X)\) 均为常量,因此可以直接拿到期望外面,即 \(E(a)=a\)\(a\) 为常量

7.3.1 性质

  • \(D(aX+b)=a^2(X)\),其中 \(a,\,b\) 为常数

    \[\begin{aligned} D(aX+b)&=E((aX+b)^2)-E^2(aX+b)\\ &=E(a^2X^2+2abX+b^2)-E(aX+b)\cdot E(aX+b)\\ &=a^2E(X^2)+2abE(X)+E(b^2)-(aE(X)+E(b))^2\\ &=a^2E(X^2)+2abE(X)+b^2-(aE(X)+b)^2\\ &=a^2E(X^2)+2abE(X)+b^2-a^2E^2(X)-2abE(X)-b^2\\ &=a^2E(X^2)-a^2E^2(X)\\ &+a^2D(X) \end{aligned} \]

  • \(X,\,Y\) 相互独立,则 \(D(X+Y)=D(X)+D(Y)\)

    \[\begin{aligned} D(X+Y)&=E((X+Y)^2)-E^2(X+Y)\\ &=E(X^2+2X\cdot Y+Y^2)-E(X+Y)\cdot E(X+Y)\\ &=E(X^2)-2E(XY)+E(Y^2)-(E(X)+E(Y))^2\\ &=E(X^2)-2E(X)E(Y)+E(Y^2)-E^2(X)-2E(X)E(Y)+E^2(Y)\\ &=E(X^2)-E^2(X)+E(Y^2)-E^2(Y)\\ &=D(X)+D(Y) \end{aligned} \]

posted @ 2020-05-20 09:34  狂飙霹雳虎  阅读(2250)  评论(0编辑  收藏  举报