特殊函数
Gamma Function
- Gamma Function: $\Gamma(x)=\int^\infty_0e^{-t}t^{x-1}dt$
- 性质
- $\Gamma(x+1)=x\Gamma(x)$
- $\Gamma(n+1)=n!$
- $\Gamma(\frac{1}{2})=\sqrt{\pi}$
- $\Gamma(n+\frac{1}{2})=\frac{\sqrt\pi}{2^n}(2n-1)!!$
- $\Gamma(\frac{1}{2}-n)=(-1)^n\frac{2^n\sqrt{\pi}}{(2n-1)}!!$
- $I_n=\int^\infty_0x^ne^{-x^2}dx=\frac{1}{2}\Gamma(\frac{n+1}{2})$
- Guassian Integral: $\int_{-\infty}^{\infty}ae^{\frac{-(x-b)^2}{c^2}}=ac\sqrt{\pi}$
Riemann Zeta Function
- $\zeta(z)=\sum_{n=1}^{\infty}\frac{1}{n^z}, Re(z)>1$
- $\zeta(z)=\frac{1}{1-2^{1-z}}\sum_{n=1}^\infty(-1)^{n+1}\frac{1}{n^z}, Re(z)>0$
- $\int^\infty_0\frac{x^{z-1}}{e^x\pm0}dx=\Gamma(z),z>1$
- $\int^\infty_0\frac{x^{z-1}}{e^x-1}dx=\Gamma(z)\zeta(z),z>1$
- $\int^\infty_0\frac{x^{z-1}}{e^x+1}dx=(1-2^{1-z})\Gamma(z)\zeta(z),z>0$
- $\zeta(0)=-\frac{1}{2}$
- $\zeta(2)=\frac{\pi^2}{6}$
等价类
- disjoint union: $\bigsqcup$
- Cartesian product: $A\times B = {(a,b)|a\in A,b\in B}$
- Equivalence relation:
- $a\in A\rightarrow a\sim a$
- $a\sim b\rightarrow b\sim a$
- $a\sim b, b\sim c\rightarrow a\sim c$
- Equivalence class: $[a]={b\in A|b\sim a}$, $A=\bigsqcup_{a\in A}[a]$
区间互素
对于 a,在区间(1,n)中有多少与其互素的数?
令$A_i$表示(1..n)中素因子$p_i$的倍数。不互素的数即为$| \cup_iA_i |$
使用 mask 穷举所有可能,使用唯一 1 串判断存在元素
关键代码
LL work(int a,int n){
split(a,prime_of_n,len);
LL mask = 1<<len,ans=0;
for (int i=1;i<mask;++i){
LL cnt =0, v=1;
for (int j=0;j<len;++j)
if (i&(1<<j)){
cnt ++;
v *= prime_of_n[j+1];
}
if (cnt&1) ans+=n/v;
else ans-=n/v;
}
return n-ans;
}
莫比乌斯反演
令 f(k)= Num(gcd(x,y)==k),F(k) = Num(k|gcd(x,y)) = [A/d]*[B/d] F(k) = $\sum_{k|d}f(d)$ 得 f(k) = $\sum_{k|d}\mu(d/k)F(d)$
关键代码
for (int i=1;i<=b;++i) ans += (LL)mu[i] * (b/i) * (d/i);
不定方程的解
$$x_1+x_2+…+x_n = m$$
正整数解
$$C_{m-1}^{n-1}$$
非负整数
$$C_{m+n-1}^{n-1}$$
最小限制
$$C_{m+n-\sum_{i=1}^{n}a_i-1}^{n-1}$$
最大限制
当$b_i>=m-n+1$时,解数为 $$C_{m-1}^{n-1}$$ 当$b_i<=m-n$时,解数为 $$C_{n+m+\sum_{i=1}^{n-1}b_i-1}^{n-1}$$
最大值
- 无穷大: 0x7fffffff 32-bit int 最大值 2147483647 1e9
- 大值: 0x3f3f3f3f 1061109567 1e9
- 赋值无穷大: memset(a,0x3f,sizeof(a))
生成函数
称函数$G(x) = a_0 + a_1x + a_2x + …$ 为数列${a_n}$的生成函数。
用途
- 把组合问题的加法法则和幂级数的乘幂对应起来
通用表达式为
$$(x^{v[0]n1[0]}+x^{v[0](n_1[0]+1)}+x^{v[0]*(n_1[0]+2)}+…+x^{v[0]n_2[0])}$$ $$(x^{v[1]n1[1]}+x^{v[1](n_1[1]+1)}+x^{v[1](n_1[1]+2)}+…+x^{v[1]n_2[1])}$$ $$…$$ $$(x^{v[K]n1[K]}+x^{v[K](n_1[K]+1)}+x^{v[K](n_1[K]+2)}+…+x^{v[K]*n_2[K])}$$
$K$对应具体问题中物品的种类数。
$v[i]$表示该乘积表达式第 i 个因子的权重,对应于具体问题的每个物品的价值或者权重。
$n_1[i]$表示该乘积表达式第 i 个因子的起始系数,对应于具体问题中的每个物品的最少个数,即最少要取多少个。
$n_2[i]$表示该乘积表达式第 i 个因子的终止系数,对应于具体问题中的每个物品的最多个数,即最多要取多少个。
系数 1 表示方案的贡献数
多项式与生成函数
多项式可以看作是一个在其次数模意义下的生成函数。数列的卷积可以看作是多项式的乘法,继而使用多项式求逆等算法。
积性函数
- [n/ab] = [[n/a]/n]; [n/ab] = [[n/a]/n]
- [n/i] 只有$O(\sqrt{n})$种取值
- 狄利克雷卷积 $f*g$
- 积性函数
$e(x); I(x); id(x); \phi(x)$; $\mu(x)$
$f_k(x) = \prod_ip_i^{[\frac{a_i}{k}]}$
积性函数求值
- 满足$i<n,gcd(i,n)=d$的 i 共$\phi(n/i)$个
- 利用质因数分解,f(p^k)求 f(n)
- 利用狄利克雷卷积的交换律和结合律化简
- 积性函数前缀和:在欧拉筛过程中推出O(n)求积性函数点值
低于线性时间求和
- [n/i] 只有$O(\sqrt{n})$种取值 (两个数组,一个存 f(1)-f($\sqrt n$),一个存 f(n/1)-f(n/$\sqrt n$)) 以下为 O($\sqrt n$)的穷举 for (int i=2;i<=n;i=j+1){ j = n/(n/i); }
莫比乌斯反演
****莫比乌斯函数与容斥原理
- $I*\phi = id$
- $I*\mu = e$
- $\mu * (1/n) = \phi/n$
- $F = If \rightarrow f = \muF$
- $I * f = \sum_{d|n}f(d)$
- $\phi = I*\mu * \phi = \sum_{d|n}(\mu*\phi)$
- $\sum_{d|gcd(a,b)} = \sum_{d|a,d|b}$
杜教筛
求$S(n) = \sum_{i=1}^{n}f(i)$
性质:h=f*g,则$\sum_{i=1}^{n}h(i)=\sum_i^ng(i)S([n/i])$
得: g(1)S(n) = $\sum_{i=1}^nh(i)-\sum_2^ng(i)S([n/i])$
O(1)计算 g(i)前缀和,O($\sqrt n$)计算$\sum_{i=1}^nh(i)$,时间复杂度为 O($n^\frac{3}{4}$)。
若 f 为积性函数,先用欧拉筛求出前$n^\frac{2}{3}$项,更后面的项再递归。_O($n^\frac{2}{3}$)求积性函数前缀和_
积性函数的情况
- 莫比乌斯函数
- 欧拉函数
Extended Eratosthenes Sieve (或洲阁筛)
求$S(n) = \sum_{i=1}^{n}f(i)$, f(p)为关于 p 的多项式。_O($\frac{n^\frac{3}{4}}{logn}$)求积性函数前缀和_
和分两部分,是否有>$\sqrt n$的质因子 $\sum_{i=1}^{n}F(i) = \sum_{1<=1<=n\newline no\ factors>\sqrt n}F(i)(1+\sum_{\sqrt n<=j<=[\frac{n}{i}]\newline j\ is\ prime}F(j)$
第一部分
$g_k(i,j)$: 前 i 个质数互质的数的 k 次幂和 $g_k(i,j)=g_k(i-1,j)-p^kg_k(i-1,[\frac{j}{p_i}])$ 当$p_i^2>j$时,$g_k(i,j)=g_k(i-1,j)-p^k$
第二部分
f(i,j): 小于$\sqrt n$的后 i 个质数的和 $f(i,j)=f(i-1,j)+\sum_{c>=1}F(p_i^c)f(i-1,[\frac{j}{p_i^c}])$ 当$p_i^2>j$时,$f(i,j)=f(i-1,j)+F(p_i)$
rng58-clj 等式
d(x)为 x 的约数个数 $$\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{k=1}^{c}d(ijk)=\sum_{gdc(i,j)=gcd(i,k)=gcd(j,k)=1}[\frac{a}{i}][\frac{b}{j}][\frac{c}{k}]$$
Lucas Theorem
$$\binom{n}{m} = \prod\binom{n_i}{m_i} (mod\ p)$$ where $n = \sum_{k=0}^{k} n_kp^k$ and $m = \sum_{k=0}^{k} m_kp^k$ If $n_i<m_i$, $\binom{n_i}{m_i}$ = 0
Proof
Lemma
For prime m and n, if 1<=m<=n-1, n|$\binom{n}{m}$
Thus $(1+x)^p = 1+x^p (mod\ p)$
With induction: Suppose $(1+x)^{p^i} = 1 + x^{p^i} (mod\ p)$ for i<=t then, $(1+x)^{p^{t+1}} = (1+x^{p^i})^p = 1 + x^{p^{t+1}} (mod\ p)$
So $(1+X)^{p^i} = 1+X^{p^i} (mod\ p)$
Theorem
$$\sum_{n=0}^{m}\binom{m}{n}x^n \newline = (1+x)^m = \prod_{i=1}^{k}((1+x)^{p^i})^{m_i} \newline = \prod_{i=1}^{k} (1+x^{p^i})^{m_i} \newline = \prod_{i=1}^{k}(\sum_{n_i=0}^{m_i}\binom{m_i}{n_i}x^{n_ip^i}) = \prod_{i=1}^{k}(\sum_{n_i=0}^{p-1}\binom{m_i}{n_i}x^{n_ip^i}) \newline = \sum_{n=0}^{m}(\prod_{i=0}^{k}\binom{m_i}{n_i})x^n$$
Algorithm
$O(log_pN)$
Code
//O(log_p n) C_n^m
LL lucas(LL n,LL m,LL mod){
//mod is prime
if (n<m) return 0;
else if (n<p) return md(md(fac[n]*inv_fac[m])*inv_fac[n-m]);
else return md(1ll*lucas(n/mod,m/mod,mod)*lucas(n%mod,m%mod,mod));
}
逆元线性递推
$[\frac{p}{i}]*i+(p%i) = 0 (\bmod p)\Rightarrow i^{-1} = -[\frac{p}{i}]*inv(p%i) (\bmod p)$
proximal mapping
- $\text{prox}f(x)=\arg\min{y\in U} f(y)+\frac{1}{2}||y-x||^2$
proximal gradient
- $\min f(x)=g(x)+h(x)$, $g(x)$ 凸且可导,$h(x)$ 可得 proximal 迭代算法, $x^k=\text{prox}_{t_kh}(x^{k-1}-t_k\nabla g(x^{k-1}))$