数学基础
数学基础
- 筛法:
- 埃氏筛 \(O(n\log \log n)\)。
注意剪枝。
prime[++cnt]=2;
for(int i=3;i<=n;i+=2) {
if(v[i]) continue;
prime[++cnt]=i;
for(int j=i*i;j<=n;j+=i*2) v[j]=1;
}
- 线性筛 \(O(n)\)。可以同时记录最小质因子做到 \(O(\log n)\) 分解质因数。
void euler() {
v[1]=v[0]=1;
for(int i=2;i<N;i++) {
if(!v[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<N;j++) {
v[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
- 线性筛筛积性函数。
欧拉函数 \(\varphi\)
void euler() {
v[1]=v[0]=1;phi[1]=1;
for(int i=2;i<=n;i++) {
if(!v[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&prime[j]*i<=n;j++) {
v[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
约数个数函数 \(\ d\)
void euler() {
v[1]=v[0]=1;d[1]=1,f[1]=1;
for(int i=2;i<=n;i++) {
if(!v[i]) prime[++cnt]=i,d[i]=2,f[i]=1;
for(int j=1;j<=cnt&&prime[j]*i<=n;j++) {
v[i*prime[j]]=1;
if(i%prime[j]==0) {
f[i*prime[j]]=f[i]+1;
d[i*prime[j]]=d[i]/f[i*prime[j]]*(f[i*prime[j]]+1);
break;
}
f[i*prime[j]]=1;
d[i*prime[j]]=d[i]*d[prime[j]];
}
}
}
tricks:
\(\gcd\) 具有可并性,可用 st 表维护。
不断加数 \(\gcd\) 个数不超过 \(\log\)。
可以进行拆位,对每一位 \(\min\)。
2.同余
- 同余方程:扩欧可求 \(ax+by=\gcd(a,b)\) 的一组可行解,(记得乘回 \(c/ \gcd(a,b)\)) ,一解可得任意解,由此可求同余方程 \(ax\equiv 1\pmod b\) 解。通解为 \(x+b\times k,k\in z\)。
void exgcd(int a,int b,ll &x,ll &y) {
if(!b) return x=1,y=0,void();
exgcd(b,a%b,y,x),y-=a/b*x;
}
- 线性逆元:
inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
- 线性阶乘逆元:
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i;
inv[n]=q_pow(fac[n],mod-2);
for(int i=n-1;~i;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
- 同余方程组:
中国剩余定理 CRT,求解模数互质的同余方程组。
1.对于第 \(i\) 个方程,得到除它以外方程的模数积 \(m_i\),对于它自身模数求逆得到 \(x\),\(ans+=x\times m_i \times a_i\)。\(a_i\) 为第 \(i\) 组方程的余数。
void crt() {
ll M=1;
for(int i=1;i<=n;i++) M*=a[i];
for(int i=1;i<=n;i++) {
ll m=M/a[i];
exgcd(m,a[i],x,y);
x=(x%a[i]+a[i])%a[i];
ans+=b[i]*m*x;
}
ans=(ans%M+M)%M;
}
-
费马小定理:对于 \(p\in prime\&\gcd(a,p)=1\),有 \(a^{p-1}\equiv 1\pmod p\) . 可用于求解逆元。
推论:对于 \(p \in prime,a^p\equiv x\pmod p\),我们可以对于指数进行对 \(\pmod {p-1}\),对底数进行 \(\pmod p\)。 -
威尔逊定理:\(p\) 为素数 \(\Leftrightarrow\) \((p-1)!\equiv -1\pmod p\).
-
欧拉定理:\(\gcd(a,m)=1时\),\(a^{\varphi(m)}\equiv1 \pmod p\).
3.组合计数
- 求组合数
线性求阶乘逆元后套公式,对比递推优势显然。
int C(int n,int m) {
return 1ll*fac[n]*inv[n-m]%mod*inv[m]%mod;
}
模数小,\(n,m\) 较大,\(p\) 较小可用 Lucas 定理。
int lucas(int n,int m) {
if(!m) return 1;
return 1ll*C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
- 组合等式
-
二项式定理:\((a+b)^n=\sum \binom n i a^ib^{n-i}\) , \((\sum^t x_i)^n=\sum \binom n {n_1,n_2,...,n_t} \prod^t x_i^{n_i}\)
-
组合数带权和:
\[\sum i\binom n i=n2^{n-1} \] -
杨辉三角递推
- 应用
-
\(k\) 个正整数相加等于 \(n\) 的可行解:$ \binom {k-1} {n-1} \(。 \)\rightarrow$ 非负整数解 ? \(x_i\geq a_i\) ?映射 \(y_i=x-a_i+1\)。转化即可。
-
不相邻组合:n个相同物品选k个不相邻的= \(\binom {n-k+1} k\) ,理解为先拿出 \(k-1\) 个,任意选,然后再两两之间插球。
-
可重集排列数:元素总数阶乘 \(/\)重复度阶乘积
可重集组合数:考虑容斥。枚举哪些数选完,\(ans=\sum _{p=0}^k(-1)^p\sum_{|A|=p} \binom {k+r-1-p-\sum {A_i+1}} {k-1}\)
-
卡特兰数:
\[H_n=\sum H_{i-1}H_{n-i}=\frac {H_{n-1}(4n-2)} {n+1}=\frac {\binom {2n} n} {n+1}=\binom {2n} n -\binom {2n} {n-1} \] 含义:① \(n\) 个 \(1\) 和 \(n\) 个 \(-1\) 排列使得无负前缀的方案数、② \(n\times n\) 网格从左下到右上且不穿对角线的非降路径数、③ 圆上 \(2n\) 个点划 \(n\) 条线段不交的方案数、④ \(n+2\) 个点的凸多边形三角剖分方案数、⑤ 长为 \(n\) 的出栈序列数量、⑥ \(n\) 个点的二叉树形态数。
-
十二重计数法:
- 球不同盒不同:\(m^n\)、
- 球不同盒不同无空:\(\sum^m (-1)^i\binom m i (m-i)^n\) _(容斥,枚举空盒数量)
- 球不同盒同:\(\sum^m {n \brace i}\)
- 球不同盒同无空:\({n \brace m}\)
- 球同盒不同:\(\binom {n+m-1} {m-1}\)
- 球同盒不同非空:\(\binom {n-1} {m-1}\)
- 球同盒同:DP,\(F_{n,m}=F_{n-m,m}[n>=m]+F_{n,m-1}\),考虑全部+1或添0即可。有空盒或没空盒。
- 球同盒同非空:\(F_{n-m,m}\)
后面多项式的不会。
-
错排:
\(D_n=(n-1)(D_{n-1}+D_{n-2})=nD_{n-1}+(-1)^n=n!\sum \frac {(-1)^i} {i!}\)。考虑前面 \(n-1\) 个全部装错和只有一个装错的情况。其他情况不可能通过一步达到错排。
-
圆排列:\((n-1)!\) ,考虑任何一种普通排列都有 \(n\) 种等价圆排列。
-
几何意义:\(\binom {n+m} n\) 即从原点 \((0,0)\) 到 \((n,m)\) 规定只能向上,向右走的方案数。
4.矩阵乘法:
- 具有结合律没有交换律,可以做快速幂,可以循环展开优化常数。
- 加速递推、作为表达修改的tag
- 定长路径统计:定长路径数量即做k次邻接矩阵的矩乘,定长最短路即做k次邻接矩阵的floyd,若统计的是 \(\leq\) 加上自环即可。

浙公网安备 33010602011771号