ACM常用公式

排列组合

  1. 组合数奇偶性判断 C(n,m)(n C ( n , m ) 为 奇 数 ⇔ ( n & m)==m m ) == m
  2. 第二类斯特林数奇偶性判断
    {nk}(nk+12k12)mod2 { n k } ≡ ( n − ⌈ k + 1 2 ⌉ ⌊ k − 1 2 ⌋ ) m o d 2

基础数论

公式
  1. 欧拉降幂(扩展欧拉定理)
    abab%ϕ(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 )
  2. 费马小定理
    p p 是质数且gcd(a, p)=1,则
    ap11 (modp) a p − 1 ≡ 1   ( mod p )
  3. 连续区间内逆元的线性递推
    对于求解 1p 1 − p 之间的所有数关于奇质数 p p 的逆元,存在线性递推关系如下:
    inv[i]=(pp/i)inv[p%i]%p
  4. 费马大定理
    当整数 n>2 n > 2 时,关于 x,y,z x , y , z 的方程 xn+yn=zn x n + y n = z n 没有正整数解
  5. 构造勾股数
    已知正整数 a,b,c a , b , c 满足 a2+b2=c2 a 2 + b 2 = c 2 ,并且 a a 是已知的,求解方程的一组正整数解
    1. a为大于 1 1 的奇数2n+1时, b=2n2+2n, c=2n2+2n+1 b = 2 ∗ n 2 + 2 n ,   c = 2 ∗ n 2 + 2 n + 1
    2. a a 为大于2的偶数 2n 2 n 时, b=n21, c=n2+1 b = n 2 − 1 ,   c = n 2 + 1
    证明
    线性求解 1p 1 − p 的逆元

    对于求解 1p 1 − p 的所有数关于奇质数 p p 的逆元,存在递推关系式如下:

    inv[i]=(MM/i)inv[M%i]%M

    证明
    t=M/i,k=M%i t = M / i , k = M % i ,那么
    ti+k0(modM) ⇒ t ∗ i + k ≡ 0 ( m o d M )
    tik(modM) ⇒ − t ∗ i ≡ k ( m o d M )
    对上式两边同时除以 ik i ∗ k
    得到 tinv[k]inv[i](modM) − t ∗ i n v [ k ] ≡ i n v [ i ] ( m o d M )
    再把 t t k替换掉,最终得到 inv[i]=(MM/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 ,就可以通过递推线性求出 1p 1 − p 模奇素数 p p 的所有逆元了。

    自然数幂和
    1. 通过递推公式求解
      S(n,k)=i=1nik,可以得到如下递归式

      S(n,k)=1k+1[(n+1)k+1(C2k+1S(n,k1)+C3k+1S(n,k2)++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+1nk=C1k+1nk+C2k+1nk1++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+11=C1k+1i=1nik+C2k+1i=1nik1++Ckk+1i=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+1i=1nik1+C3k+1i=1nik2+Ckk+1i=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,k1)+C3k+1S(n,k2)++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+1i=1k+1Cik+1Bki+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++Cn1n+1Bn1) 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 )
        这就是伯努利数的递推公式。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值