ACM notes

Proaes發表於2024-08-02

動態規劃(DP)

樹形DP

數學

位運算

異或

異或字首和

\( s(n)為1到n的數的異或和 \)

\( s(n) = \begin{cases} 1 , ~~~ n \% 4 == 1 \\ 0 , ~~~ n \% 4 == 3 \\ n , ~~~ n \% 4 == 0 \\ n + 1 , ~~~ n \% 4 == 2 \\ \end{cases} \)

程式碼實現如下:

auto xorprefix = [&](ll n) {
    int flag = n % 4;
    if (flag == 0) {
        return n;
    } else if (flag == 1) {
        return 1;
    } else if (flag == 2) {
        return n + 1;
    } else if (flag == 3) {
        return 0;
    }
};

數論

簡化公式

\( \sum\limits_{k = 1}^{n} k = \frac{n(n + 1)}{2} \)

\( \sum\limits_{k = 1}^{n} k^{2} = \frac{n(n + 1)(n + 2)}{6} \)

\( \sum\limits_{k = 1}^{n} k^{3} = (\sum\limits_{k = 1}^{n} k)^{2} = \frac{ n^{2} (n + 1)^{2} }{4} \)

裴蜀定理

\( 對於二元方程ax + by = c \)

\( 當且僅當c = gcd(a , b)時 \)

\( x , y 存在整數解 \)

\( 當c \neq gcd(a , b) \)

\( x , y 不存在整數解,但有非整數解 \)

推廣:
\( 一定存在整數x , y , 滿足ax + by = gcd(a , b) * n \)

再推廣:
\( 一定存在整數\{ x_{i} \vert i \in [1 , n] \},滿足 \)

\[\sum\limits_{i = 1}^{m} a_{i} x_{i} = gcd( \{ x_{i} \vert i \in [1 , n] \} ) \]

組合數學

排列組合

二項式定理

\[(x + y)^{a} = \sum\limits_{k = 0}^{\infty} C_{a}^{k} x^{k} y^{a - k} \]

\(\tbinom{n}{m} = C_{n}^{m}\)

容斥原理

例題:求分母不超過n的所有最簡真分數的個數與他們的和 (n <= 1e6)

顯然有:

\( ans = \sum\limits_{a = 1}^{n} \sum\limits_{b = 1}^{a} ([b < a] * [gcd(a , b) == 1]) \)

\( = (\sum\limits_{a = 1}^{n} \sum\limits_{b = 1}^{n} [gcd(a , b) == 1]) / 2 \)

那麼只需求出n以內的互質對即可。即以1最大公約數的數對

由容斥原理可以得知,先找到所有以1公約數的數對,再從中剔除所有以1的倍數為公約數的數對,餘下的數對就是以1最大公約數的數對。即f(k)=以1公約數的數對個數 - 以1的倍數為 公約數 的數對個數。

如此,最簡真分數的個數就求好了,還需求出它們的和。

可以注意到,當(x,y)為互質時,(y-x,y)也互質。

那麼有這些最簡真分數的和就是它們的個數除以2。

程式碼實現如下:

    ll nn = 2e6;
    cin >> nn;
    vector<ll> f(nn + 1);// f[i] 表示 gcd == i 的情況有幾種
    for (ll k = nn; k >= 1; k--) { 
        f[k] = (nn / k) * (nn / k);//以k為公約數的數對
        for (ll i = k + k; i <= nn; i += k) { //減去以k的倍數為公約數的數對
            f[k] -= f[i];
        }
    }
    ans1 = f[1] / 2;
    ans2 = (double)ans1 / 2.0;

    cout << ans1 << " " << ans2 << "\n";

卡特蘭數

通項公式:

\[(1) H_{n} = C_{2n}^{n} - C_{2n}^{n - 1} \]

\[(2) H_{n} = \frac{1}{n + 1} C_{2n}^{n} \]

遞推公式:

\[(3) H_{n} = \frac{4 n - 2}{n + 1} H_{n - 1} \]

Catalan 特徵:

從(0,0)到(n,n),不越過對角線,即任何時候,向上走的步數不能超過向右走的步數。
一種運算元不能超過另一種運算元,或者兩種運算元不能有交集,這些操作的方案數通常是卡特蘭數

Catalan 應用:

1.一個有n個0和n個1組成的字串,且所有的字首字串滿足1的個數不超過0的個數。這樣的字串個數是多少?
2.包含n組括號的合法運算式的個數有多少?
3.一個棧的進棧序列為1,2,3,~,n,有多少個不同的出棧序列?
4.n個結點可構造多少個不同的二叉樹?
5.在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條弦不相交的方法數?
6.透過連結頂點而將n+2邊的凸多邊形分成n個三角形的方法數?

圖論(graph)

弦圖(chord)

最大獨立集

https://oi-wiki.org/graph/chord/?query=最大獨立集

最小生成樹

need

DP
https://www.bilibili.com/video/BV1ir421T7ts/?spm_id_from=333.999.0.0&vd_source=31718b165e8ad5f16162c06a62707fe6