排列组合
- 组合数奇偶性判断: C(n,m)为奇数⇔(n C ( n , m ) 为 奇 数 ⇔ ( n & m)==m m ) == m
- 第二类斯特林数奇偶性判断:
{nk}≡(n−⌈k+12⌉⌊k−12⌋)mod2 { n k } ≡ ( n − ⌈ k + 1 2 ⌉ ⌊ k − 1 2 ⌋ ) m o d 2
基础数论
公式
- 欧拉降幂(扩展欧拉定理)
ab≡⎧⎩⎨⎪⎪ab%ϕ(p) gcd(a,p)=1ab gcd(a,p)≠1,b<ϕ(p)ab%ϕ(p)+ϕ(p) gcd(a,p)≠1,b≥ϕ(p) (mod p) a b ≡ { a b % ϕ ( p ) g c d ( a , p ) = 1 a b g c d ( a , p ) ≠ 1 , b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) ( m o d p ) - 费马小定理
若 p p 是质数且,则ap−1≡1 (modp) a p − 1 ≡ 1 ( mod p ) - 连续区间内逆元的线性递推
对于求解 1−p 1 − p 之间的所有数关于奇质数 p p 的逆元,存在线性递推关系如下: - 费马大定理
当整数 n>2 n > 2 时,关于 x,y,z x , y , z 的方程 xn+yn=zn x n + y n = z n 没有正整数解 - 构造勾股数
已知正整数 a,b,c a , b , c 满足 a2+b2=c2 a 2 + b 2 = c 2 ,并且 a a 是已知的,求解方程的一组正整数解
- 当为大于 1 1 的奇数时, b=2∗n2+2n, c=2∗n2+2n+1 b = 2 ∗ n 2 + 2 n , c = 2 ∗ n 2 + 2 n + 1
- 当 a a 为大于的偶数 2n 2 n 时, b=n2−1, c=n2+1 b = n 2 − 1 , c = n 2 + 1
证明
线性求解 1−p 1 − p 的逆元
对于求解 1−p 1 − p 的所有数关于奇质数 p p 的逆元,存在递推关系式如下:
证明:
设 t=M/i,k=M%i t = M / i , k = M % i ,那么
⇒t∗i+k≡0(modM) ⇒ t ∗ i + k ≡ 0 ( m o d M )
⇒−t∗i≡k(modM) ⇒ − t ∗ i ≡ k ( m o d M )
对上式两边同时除以 i∗k i ∗ k
得到 −t∗inv[k]≡inv[i](modM) − t ∗ i n v [ k ] ≡ i n v [ i ] ( m o d M )
再把 t t 和替换掉,最终得到 inv[i]=(M−M/i)∗inv[M%i]%M i n v [ i ] = ( M − M / i ) ∗ i n v [ M % i ] % M
初始化 inv[1]=1 i n v [ 1 ] = 1 ,就可以通过递推线性求出 1−p 1 − p 模奇素数 p p 的所有逆元了。自然数幂和
- 通过递推公式求解:
记,可以得到如下递归式S(n,k)=1k+1[(n+1)k+1−(C2k+1S(n,k−1)+C3k+1S(n,k−2)+⋯+Ckk+1S(n,1)+n+1)] S ( n , k ) = 1 k + 1 [ ( n + 1 ) k + 1 − ( C k + 1 2 S ( n , k − 1 ) + C k + 1 3 S ( n , k − 2 ) + ⋯ + C k + 1 k S ( n , 1 ) + n + 1 ) ]证明:
由二项式定理,可以得到(n+1)k+1−nk=C1k+1nk+C2k+1nk−1+⋯+Ckk+1n+1 ( n + 1 ) k + 1 − n k = C k + 1 1 n k + C k + 1 2 n k − 1 + ⋯ + C k + 1 k n + 1,令 n=1,2,3,… n = 1 , 2 , 3 , … ,累加后可得(n+1)k+1−1=C1k+1∑i=1nik+C2k+1∑i=1nik−1+⋯+Ckk+1∑i=1ni+n ( n + 1 ) k + 1 − 1 = C k + 1 1 ∑ i = 1 n i k + C k + 1 2 ∑ i = 1 n i k − 1 + ⋯ + C k + 1 k ∑ i = 1 n i + n进一步得到nk=1k+1[(n+1)k+1−(C2k+1∑i=1nik−1+C3k+1∑i=1nik−2⋯+Ckk+1∑i=1ni+n+1)] n k = 1 k + 1 [ ( n + 1 ) k + 1 − ( C k + 1 2 ∑ i = 1 n i k − 1 + C k + 1 3 ∑ i = 1 n i k − 2 ⋯ + C k + 1 k ∑ i = 1 n i + n + 1 ) ]记 S(n,k)=∑ni=1ik S ( n , k ) = ∑ i = 1 n i k ,可以得到如下递归式S(n,k)=1k+1[(n+1)k+1−(C2k+1S(n,k−1)+C3k+1S(n,k−2)+⋯+Ckk+1S(n,1)+n+1)] S ( n , k ) = 1 k + 1 [ ( n + 1 ) k + 1 − ( C k + 1 2 S ( n , k − 1 ) + C k + 1 3 S ( n , k − 2 ) + ⋯ + C k + 1 k S ( n , 1 ) + n + 1 ) ]递归出口是 k==1 k == 1 , S(n,k)=n(n+1)2 S ( n , k ) = n ( n + 1 ) 2
在递归的过程中进行记忆化,可以在 O(k2) O ( k 2 ) 的时间复杂度内求解自然数和- 通过伯努利数求解
通过伯努利数以及必要的预处理,可以在线性时间复杂度内求解出自然数幂和,公式描述如下:∑i=1nik=1k+1∑i=1k+1Cik+1Bk−i+1(n+1)i ∑ i = 1 n i k = 1 k + 1 ∑ i = 1 k + 1 C k + 1 i B k − i + 1 ( n + 1 ) i
求伯努利数的方法:
伯努利数满足条件 B0=1 B 0 = 1 ,且有 ∑nk=1Ckn+1=0 ∑ k = 1 n C n + 1 k = 0 ,那么继续得到Bn=−1n+1(C0n+1B0+C1n+1B1+⋯+Cn−1n+1Bn−1) B n = − 1 n + 1 ( C n + 1 0 B 0 + C n + 1 1 B 1 + ⋯ + C n + 1 n − 1 B n − 1 )这就是伯努利数的递推公式。
- 通过伯努利数求解