zhangtj

导航

NOIP复习计划——数学

组合数学

组合数

Lucas 定理

\(p\) 为质数。

\[{n \choose k} \equiv {\lfloor \frac{n}{p} \rfloor \choose \lfloor\frac{k}{p} \rfloor}{n \mod p \choose k \mod p}\pmod p \]

卡特兰数

(必会)常见公式:

\[H_n={2n \choose n}-{2n \choose n-1} \]

应用

  1. 折线计数。

补充

\((0,0)\) 走到 \((n,m)\),不碰到直线 \(y=x+b\) 的方案数:

\[{n+m \choose n}-{n+m \choose n+b} \]

意义为沿着直线翻折,越过直线的路径对称域从翻折顶点到终点的路径。(翻折到的点以 \(y=x+b\)\(x=n\) 的交点为横坐标,\(y=x+b\)\(y=m\) 交点为纵坐标,\((m-b,n+b)\)

斯特林数

第二类斯特林数

在小球与盒子那道模板题中见到的,\(n \brace m\) 表示将 \(n\) 个互相区分的元素,划分为 \(m\) 个互不区分的非空子集的方案数

(必会)递推式:

\[{n \brace m}=m {n-1 \brace m}+{n-1 \brace m-1} \]

通项公式:\(n,m\) 较大时使用,需要二项式反演来证,参 OI Wiki。

\[{n \brace m}=\sum\limits_{i=0}^m\dfrac{(-1)^{m-i}i^n}{i!(m-i)!} \]

应用
  1. 若要求非空子集互相区分,直接乘上 \(m!\) 即可。

组合意义

代数推导灭天地,组合意义保平安。但对于蒟蒻来说都不会。

例题

[CF1842G] Tenzing and Random Operations

[AGC001E] BBQ Hard

推式子

二项式定理

内容:

\[(x+y)^n=\sum_{k=0}^n\ C{_n^k} x^k y^{n-k} = \sum_{k=0}^n\ C{_n^k} x^{n-k} y^k \]

应用:化简式子。

形式 \(\sum_{k=0}^n\ C{_n^k} x^k y^{n-k}\) 要想到化为左式。

对于形式 \(\sum_{k=0}^n C_n^k x^k\),要想到化为 \(\sum_{k=0}^n C_n^k x^k 1^{n-k}=(x+1)^n\)

二项式反演

\(f_n\) 表示恰好使用 \(n\) 个不同元素形成特定结构的方案数,\(g_n\) 表示从 \(n\) 个不同元素中选出 \(i \geq 0\) 个元素形成特定结构的总方案数。

若已知 \(f_n\)\(g_n\),那么显然有:

\[g_n = \sum_{i = 0}^{n} \binom{n}{i} f_i \]

若已知 \(g_n\)\(f_n\),那么:

\[f_n = \sum_{i = 0}^{n} \binom{n}{i} (-1)^{n-i} g_i \]

上述已知 \(g_n\)\(f_n\) 的过程,就称为二项式反演。

数论

gcd

往数集中加入一个数,要么gcd不变,要么最多变为原来的 \(\frac{1}{2}\)

裴蜀定理

对于任意自然数 \(a,b\),存在整数 \(x,y\) 满足 \(ax+by=\gcd(a,b)\)

线性同余方程

形如 \(ax \equiv b \pmod m\),转化为求 \(ax+my=b\) 的解。

\(gcd(a,m) \nmid b\) 则无解。

否则利用 exgcd 求得一组 \(ax+my=\gcd(a,m)\) 的特解 \(x_0,y_0\)

方程的通解为:

\[\left\{ \begin{aligned} x=x_0+\frac{km}{\gcd(a,m)}\\ y=y_0-\frac{ka}{\gcd(a,m)} \end{aligned} \right. \]

exgcd

貌似这种写法比较多。

int exgcd(int a,int b,int &x,int &y){
	if(!b){x=1,y=0;return a;}
	int d=exgcd(b,a%b,x,y);
	int tmp=x;
	x=y;y=tmp-a/b*y;
	return d;
}

CRT

NOIP 应该没有这么裸的题吧,EXCRT 什么的就不学了。

对于

\[\left\{ \begin{aligned} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \\ \text{...} \\ x \equiv a_n \pmod {m_n} \end{aligned} \right. \]

\(MOD=\prod_{i=1}^n m_i,M_i= \frac{MOD}{m_i}\)

\(t_i\) 表示 \(M_i\) 在模 \(m_i\) 意义下的逆元。

\(ans=(\sum_{i=1}^n a_i M_i t_i)\mod MOD\)

线性代数

OI 中只涉及 \(n\) 维实线性空间和 \(n\) 维布尔域线性空间。

高斯消元法是求解线性方程组的经典算法,还可以用于求线性基、行列式计算、求矩阵的逆。

线性方程组

部分代码(「SDOI2006」线性方程组)

double a[N][N];//a[i][j] 表示第 i 个方程中第 j 个元的系数,a[i][n+1] 为等号右侧的常数项
void Gauss(){
    for(int i=1;i<=n;i++){
        //当前消第 i 个元
        //找第 i 个元系数绝对值最大的行 m
        int mxo=i;
        for(int j=1;j<=n;j++){
            if(fabs(a[j][j])>eps&&j<i)continue;
            if(fabs(a[j][i])>fabs(a[mxo][i]))mxo=j;
        }
        //换第 i 行和第 m 行,使得交换后第 i 行第 i 个元系数最大 
        for(int j=1;j<=n+1;j++)
            swap(a[i][j],a[mxo][j]);
        if(fabs(a[i][i])<eps)continue;//无解或有无数解
        for(int j=1;j<=n;j++){//在每一个方程中消元 
            if(i==j)continue;
            double tmp=a[j][i]/a[i][i];//令 tmp 为当前行第 i 个元系数与第 i 行第 i 个元系数的比值
            for(int k=i;k<=n+1;k++)//1~i-1 为 0,可以从 i 开始 
                a[j][k]-=a[i][k]*tmp;
        }
    }
}

若出现系数全 \(0\) 且常数项不为 \(0\),则为无解(方程间矛盾)。

否则若出现系数全 \(0\) 且常数项为 \(0\),则有无数解(方程中有等价的)。

否则矩阵变为

\[\left[\begin{array}{c} k_1 & 0 & 0 & 0 & \text{...} & v_1 \\ 0 & k_2 & 0 & 0 & \text{...} & v_2 \\ 0 & 0 & k_3 & 0 & \text{...} & v_3 \\ \text{...} & \text{...} & \text{...} & \text{...} & \text{...} & \text{...} \\ 0 & 0 & 0 & k_n & \text{...} & v_n \end{array} \right] \]

消去系数可得到化简后的矩阵。

线性基

称线性空间 \(V\) 的一个极大线性无关组为 \(V\) 的一组线性基。高斯消元法求解。

部分代码(「JLOI2015」装备购买)

#define ld long double
ld a[N][N];
int cnt;//cnt 表示已求出的线性基数量 
for(int i=1;i<=m;i++){//最多买 m 件装备
    int now=0;//在为求出的方程中找存在第 i 个元且常数项最小的
    for(int j=cnt+1;j<=n;j++){
        if(fabs(a[j][i])>eps&&(now==0||w[j]<w[now]))now=j;
    }
    if(now==0)continue;//可由其它方程表示出(非线性基)
    ++cnt;
    ans+=w[now];
    for(int k=1;k<=m;k++)
        swap(a[now][k],a[cnt][k]);//交换当前第 cnt 行和后面的第 now 行
    swap(w[now],w[cnt]);
    for(int j=1;j<=n;j++){//与高斯消元同
        if(j!=cnt&&fabs(a[j][i])>eps){
            ld t=a[j][i]/a[cnt][i];
            for(int k=i;k<=m;k++)
                a[j][k]-=a[i][k]*t;
        }
    }
}

异或线性基

可使用高斯消元,但贪心法一般更简单。

ll base[55],ans;
bool insert(ll x){
    for(int i=50;i>=0;i--)
        if(x>>i&1){
            if(base[i])x^=base[i];
            else{
                base[i]=x;
                return 1;
            }
        }
    return 0;
}

行列式

意义

  1. 行列式中的行或列向量所构成的超平行多面体的有向面积或有向体积。
  2. 矩阵 \(A\) 的行列式 \(\det(A)\) 就是线性变换 \(A\) 下的图形面积或体积的伸缩因子。其实矩阵和行列式有关联。

应用

  1. LGV 引理,矩阵树定理……
  2. (新考法)\(det(AB)=det(A)det(B)\),笔者见过以此来出的 BSGS 题。

技巧

博弈(大概不是 NOIP 级的吧)

Nim游戏:异或和为 \(0\) 则先手必败,否则必胜。

对数

(新考法)\(\log(ab)=\log(a)+\log(b)\),可以用 \(\log\) 来比较两个根本无法存下的数的大小。

Reference

  1. https://oi-wiki.org/math/combinatorics/stirling/
  2. https://oi-wiki.org/math/combinatorics/combination/
  3. https://www.cnblogs.com/xzyxzy/p/9903896.html

posted on 2024-08-14 20:35  zhangtj  阅读(14)  评论(0编辑  收藏  举报