除法取模与逆元/费马小定理_数论是什么时候学的

除法取模与逆元/费马小定理_数论是什么时候学的该文章是一篇关于数论中除法取余和费马小定理的讲解。文章详细介绍了取余运算的性质以及费马小定理的应用,对于数论算法有很好的参考价值。

除法取模与逆元/费马小定理_数论是什么时候学的"

背景

对于取余运算,有以下一些性质,加减乘都符合分配律
( 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 解析

今天的文章除法取模与逆元/费马小定理_数论是什么时候学的分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83243.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注