1. 程式人生 > >匯思學 18國慶 數論

匯思學 18國慶 數論

height n) 前綴和 卡特蘭數 因數 != 次方 所有 gcd

      數

1.快速冪

typedef long long LL;

LL qpow(int a, int b) {  //快速冪 
    LL res = 1;
    while (b) {
        if (b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}

LL mul(int a, int b) {  //快速乘 
    LL res = 0;
    while (b) {
        if (b & 1) res = (res + a) % p;
        a 
= (a + a) % p; b >>= 1; } return res; }

2.逆元
(1)費馬小定理求逆元

  若 p 是質數,且 p 不是 a 的約數

  根據費馬小定理有:ap - 1 ≡ 1 (mod p)

  所以 a 的逆元 x = ap - 2

(2)歐拉定理求逆元

  若 a 與 p 互質

  根據歐拉定理有:aφ(p) = 1 (mod p)

  所以 a 的逆元 x = aφ(p) - 1

3.最大公約數 gcd
(1)從大到小枚舉
(2)分解質因數求解
(3)更相減損術 gcd(a, b) = gcd(a - b, b)


(4)輾轉相除法 gcd(a, b) = gca(a % b, b)

int gcd(int x, int y) {
    return y == 0 ? x : gcd(x, x % y);
}

4.最小公倍數 lcm

int lcm(int x, int y) {
    return x / gcd(x, y) * y;
}


5.擴展歐幾裏德 exgcd
(1)ax + by = gcd(a, b)
(2)X = x + b/gcd * k, Y = y - a/gcd * k;
(3)ax + by != k*gcd(a, b) (k != 0) 此時無解


(4)令k = c/gcd(a, b)
相當於求 k * (ax + by) = gcd(a, b) * k
求出ax + by = gcd(a, b)後,將解乘k即可

void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y) {
    if (!b) { d = a; x = 1; y = 0; }
    else { ex_gcd(b, a % b, d, y, x); y -= x * (a / b); }
}

6.同余

  a ≡ b (mod p) → (a - b) mod p = 0;

  ax ≡ 1 (mod b) 相當於 ax + by = 1

  當 a , b 互質時有解

  用 exgcd 求出一組一組解,然後再求出最小正整數解

7.同余方程組
考慮方程組 x ≡ r1(mod m1)

     x ≡ r2(mod m2)

  x = k1 * m1 + r1 = k2 * m2 + r2 → k1 * m1 - k2 * m2 = r2 - r1

  相當於 ax + by = c
8.離散對數
9.線性篩素數

for (int i = 2; i <= n; ++i) {
    if (!bz[i]) pri[++cnt] = i;
    for (int j = i; j <= cnt; ++j) {
        if (i * pri[j] > n) break;
        bz[i * pri[j]] = 1;
        if (i % pri[j] == 0) break;  //保證了每個數只會被篩一次
                //只會被自己最小的質因子篩掉
    }
}


10.歐拉函數
  線性篩法求歐拉函數

//在篩素數時順便求出歐拉函數
for (int i = 2; i <= n; ++i) {
    if (!bz[i]) pri[++cnt] = i, phi[i] = i - 1;
    for (int j = 1; j <= cnt; ++j) {
        if (i * pri[j] > n) break;
        bz[i * pri[j]] = 1;
        if (i % pri[j] != 0) phi[i * pri[j]] = phi[i] * (pri[j] - 1);
        if (i % pri[j] == 0) {
            phi[i * pri[j]] = phi[i] * pri[j];
            break;
        }
    }
}


11.組合數
(1)C(m, n) = m! / n!(m - n)!
例題:NOIP2016 D2T1 組合數問題
解:楊輝三角預處理,求二維前綴和 f[i][j] ,並在過程中對 k 取模,根據 f[i][j] 的值是否為 0 判斷是否為 k 的倍數
(2)Lucas定理

(3)若數據範圍不大(0 ≤ n ≤ m ≤ 105, 1 ≤ p ≤ 109),可直接預處理階乘和階乘的逆元,直接計算

(4)一些比較有用的公式

技術分享圖片

12.容斥原理

  技術分享圖片

如圖,總面積為 A + B + C - AC - AB - BC + ABC

容斥的重要功能就是化繁為簡

13.斐波納契數列

  f[0] = f[1] = 1;

  f[i] = f[i - 1] + f[i - 2];

14.卡特蘭數

  C(1) = 1;

  C(n) = C(1) * C(n - 1) + C(2) * C(n - 2) + …+ C(n - 1) * C(1);

通項公式:C(n + 1) = C(2n, n) - C(2n, n - 1);

15.錯排

考慮一個有 n 個元素的排列,若一個排列中所有的元素都不在自己原來的位置上,那麽就稱這樣的一個排列為原排列的一個錯排

n 個元素的錯排記為 D(n)

  D(1) = 0; D(2) = 1;

  D(n) = (n - 1)(D(n - 1) + D(n - 2));

16.高斯消元

  (1)用於解多元一次方程組

  (2)異或高斯消元

   相當於把加減換成異或,其實更簡單一些

17.

匯思學 18國慶 數論