1. 程式人生 > >數論總結 (常用定理+ 模板)

數論總結 (常用定理+ 模板)

擴展歐幾裏德算法 二項式 rime spa 模板 phi 歐拉函數 noip prim

刷了好幾天的數論了

noip要考的幾乎都刷了一遍

看著公式有生無可戀的感覺啊


下面是一些總結

1.組合數

去年的noip考了組合數遞推公式

C(n, m) = C(n - 1, m - 1) + C(n - 1, m);

還有可以通過二項式定理推出來的幾個結論

C(n, 0) + C(n, 1) + C(n, 2) + ... + C(n, n) = 2n

ΣC(n, i) = 2n - 1 (i 為基數或 i 為偶數)

2.(擴展)歐幾裏德算法

歐幾裏德算法

1 void gcd(ll a, ll b) {
2     return (b == 0) ? a : gcd(b, a % b);
3 }

擴展歐幾裏德算法

用於求不定方程 ,逆元啊等等

可以求出 ax + by = gcd (a, b) 的一組解 x, y,並且|x| + |y| 最小。

1 void exgcd(ll a, ll b, ll& d, ll& x, ll &y) {
2     if (!b) { d = a; x = 1; y = 0; }
3     else { exgcd(b, a % b, d, y, x); y -= x*(a/b); }
4 }

3.歐拉函數

φ(n) = n (1 - 1 / p1) (1 - 1 / p2) ... (1 - 1 / pk);

線性求歐拉函數


inline ll GetPhi(ll a) {
    ll res = a;
    for (int i = 2; i * i <= a; i++)
        if (a % i == 0) {
            res = res / i * (i - 1);
            while (a % i == 0)    a /= i;
        }
    if (a > 1)    res = res / a * (a - 1);
    return res;
}

篩法求歐拉函數 (順便可以求素數

ll phi[N + 10], p[N >> 1
], tot; bool f[N] = {1, 1}; inline void GetPhi() { phi[1] = 1; for (int i = 2; i <= N; i++) { if (! f[i]){ p[tot++] = i; phi[i] = i - 1; } for (int j = 0; j < tot && p[j] * i <= N; j++) { f[p[j] * i] = true; if (i % p[j]) phi[i * p[j]] = phi[i] * (p[j] - 1); else phi[i * p[j]] = phi[i] * p[j]; } } }

3.費馬小定理

這個應該都知道啦

ap - 1 ≡ 1 (mod p)

4.線性篩素數

int p[N], tot;
inline void prime(int n) {
    f[0] = true; f[1] = true;
    for (int i = 2; i <= n; i++) {
        if (!f[i])    p[tot++] = i;
        for (int j = 0; j < tot && i * p[j] <= n; j++) {
            f[i * p[j]] = true;
            if (i % p[j] == 0)    break;
        }
    }
}

4.逆元

5.組合數取模(盧卡斯定理)

(待補充...)

數論總結 (常用定理+ 模板)