【算法讲解】数论——除法取余,费马小定理

背景

对于取余运算,有以下一些性质,加减乘都符合分配律
( a + b ) % p = ( a % p + b % p ) % p ( a ⋅ b ) % p = ( a % p ⋅ b % p ) % p ( a − b ) % p = ( a % p − b % p ) % p (a+b)\%p=(a\%p+b\%p)\%p\\ (a\cdot b)\%p=(a\%p\cdot b\%p)\%p\\ (a-b)\%p=(a\%p-b\%p)\%p\\ (a+b)%p=(a%p+b%p)%p(ab)%p=(a%pb%p)%p(ab)%p=(a%pb%p)%p
但唯独除法不符合分配律
a b % p ≠ a % p b % p % p \frac{a}{b}\%p \neq \frac{a\%p}{b\%p}\%p ba%p=b%pa%p%p
我们可以用乘法分配律很容易计算 a 1 ⋅ a 2 ⋯ a n % p a_1\cdot a_2\cdots a_n\%p a1a2an%p
但当我们计算 a 1 ⋅ a 2 ⋯ a n b 1 ⋅ b 2 ⋯ b n % p \frac{a_1\cdot a_2\cdots a_n}{b_1 \cdot b_2\cdots b_n}\%p b1b2bna1a2an%p 时就,常见的就有组合数 ( n r ) = n ! r ! ⋅ ( n − r ) ! \binom{n}{r} =\frac{n!}{r!\cdot (n-r)!} (rn)=r!(nr)!n! 的取余

为了解决这个问题,我们需要依赖一个著名定理:费马小定理

费马小定理

p p p 为质数,对于任意的与 p p p互质的整数 a a a,都有 a p − 1 a^{p-1} ap1 取余 p p p 等于 1 1 1

a p − 1 ≡ 1 m o d    p , p 是质数, a ⊥ p a^{p-1}\equiv1\mod p, p是质数,a \perp p ap11modp,p是质数,ap
符号说明:
a ≡ b m o d    c a\equiv b \mod c abmodc:表示对于整数 a a a, b b b, c c c a a a 除以 c c c b b b
a ⊥ b a\perp b ab:表示 a a a, b b b 互质

解决除法的取余

根据乘法的分配律,可得 a b % p = ( a % p ⋅ 1 b % p ) % p \frac{a}{b}\%p=(a\%p\cdot \frac{1}{b}\%p)\%p ba%p=(a%pb1%p)%p
所以我们需要计算的就是 1 b % p \frac{1}{b}\%p b1%p
1 b ≡ b ′ % p \frac{1}{b}\equiv b'\%p b1b%p,我们称 b ′ b' b b b b 的逆元
b ⋅ b ′ ≡ 1 m o d    p b\cdot b' \equiv1\mod p bb1modp
根据费马小定理 b p − 1 ≡ 1 m o d    p b^{p-1}\equiv1\mod p bp11modp
所以 b p − 1 ≡ b ⋅ b ′ m o d    p b^{p-1}\equiv b\cdot b'\mod p bp1bbmodp
两边去同类项 b b b 可得 b ′ ≡ b p − 2 m o d    p b' \equiv b^{p-2} \mod p bbp2modp
所以 1 b ≡ b p − 2 m o d    p \textcolor{Red}{\frac{1}{b}\equiv b^{p-2} \mod p} b1bp2modp
b p − 2 m o d    p b^{p-2} \mod p bp2modp 可以通过快速幂计算得到

代码

计算组合数 ( n r ) \binom{n}{r} (rn)

int mod = 998244353;
int qpow(int x, int n) { // 快速幂,求 x 的 n 次方
  int res = 1;
  for (; n; n >>= 1, x = 1LL * x * x % mod) 
    if (n & 1) 
      res = 1LL * res * x % mod;
  return res;
}
int binom(int n, int r) {
  int res = 1;
  for (int i = 1; i <= n; i ++) {
    res = 1LL * res * i % mod;
  }
  for (int i = 1; i <= r; i ++) {
    res = 1LL * res * qpow(i, mod - 2) % mod;
  }
  for (int i = 1; i <= (n - r); i ++) {
    res = 1LL * res * qpow(i, mod - 2) % mod;
  }
  return res;
}

练习

题目解析
CF 1833 F Ira and Flamenco暂无
CF 1838 E Count Supersequences解析
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值