| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> c++乘法逆元 -> 正文阅读 |
|
[C++知识库]c++乘法逆元 |
逆元是什么我们都知道,在模意义下: ( 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-b)\%p=(a\%p-b\%p)\%p (a?b)%p=(a%p?b%p)%p ( a × b ) % p = ( a % p × b % p ) % p (a\times b)\%p=(a\%p\times b\%p)\%p (a×b)%p=(a%p×b%p)%p 但是: ( a b ) % p ≠ ( a % p b % p ) % p (\dfrac{a}{b})\%p\neq (\dfrac{a\%p}{b\%p})\%p (ba?)%p=(b%pa%p?)%p 因此,逆元就诞生了。 若 a x ≡ 1 ( m o d p ) ax\equiv 1 \pmod p ax≡1(modp),那么我们称 x x x为 a a a关于 p p p的逆元,用 a ? 1 a^{-1} a?1表示 所以 ( a b ) % p = ( a % p × b ? 1 % p ) % p (\dfrac{a}{b})\%p=(a\%p\times b^{-1}\%p)\%p (ba?)%p=(a%p×b?1%p)%p 这样我们就可以解决除法的问题了。 怎么求逆元求逆元的前提: gcd ? ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 费马小定理因为 a p ≡ a ( m o d p ) a^p\equiv a\pmod p ap≡a(modp), 所以 a p ? 2 ≡ a ? 1 ( m o d p ) a^{p-2}\equiv a^{-1} \pmod p ap?2≡a?1(modp) 所以 a ? 1 ≡ a p ? 2 ( m o d p ) a^{-1}\equiv a^{p-2} \pmod p a?1≡ap?2(modp) 具体证明参见OI-WIKI 时间复杂度为 O ( l o g ? p ) O(log \ p) O(log?p) 扩展欧几里德a x + p y = 1 ax+py=1 ax+py=1的一组解 ( x , y ) (x,y) (x,y), x x x是 a a a关于 p p p的逆元。 证明: a x + p y = 1 a x % p + p y % p = 1 % p a x + p y ≡ 1 ( m o d p ) a x ≡ 1 ( m o d p ) \begin{aligned} ax+py &= 1 \\ ax\%p+py\%p &= 1\% p \\ ax+py &\equiv 1\pmod p \\ ax &\equiv 1 \pmod p \end{aligned} ax+pyax%p+py%pax+pyax?=1=1%p≡1(modp)≡1(modp)? 所以 x x x是 a a a关于 p p p的逆元。时间复杂度为 O ( l o g ? p ) O(log \ p) O(log?p) 连续数的逆元求 1 1 1到 n n n的逆元,如果一个一个求,那么很容易超时。我们可以线性来求。 显然, 1 ? 1 ≡ 1 ( m o d p ) 1^{-1}\equiv 1\pmod p 1?1≡1(modp) 假设现在我们求完了前 i ? 1 i-1 i?1个数的逆元,要求第 i i i个。我们令 k = ? p i ? , j = p % i k=\lfloor\frac{p}{i}\rfloor,j=p \% i k=?ip??,j=p%i,有 p = k i + j p=ki+j p=ki+j,所以 k i + j ≡ ( m o d p ) ki+j\equiv \pmod p ki+j≡(modp) 两边同时乘 i ? 1 × j ? 1 i^{-1}\times j^{-1} i?1×j?1得: k j ? 1 + i ? 1 ≡ 0 ( m o d p ) kj^{-1}+i^{-1}\equiv 0 \pmod p kj?1+i?1≡0(modp) i ? 1 ≡ ? k j ? 1 ( m o d p ) i^{-1}\equiv -kj^{-1} \pmod p i?1≡?kj?1(modp) 将 k = ? p i ? , j = p % i k=\lfloor\frac{p}{i}\rfloor,j=p \% i k=?ip??,j=p%i代入得: i ? 1 ≡ ? ? p i ? × ( p % i ) ? 1 ( m o d p ) i^{-1}\equiv -\lfloor\frac{p}{i}\rfloor\times(p \% i)^{-1} \pmod p i?1≡??ip??×(p%i)?1(modp) 因为 p % i < i p\% i<i p%i<i,我们已经求出小于 i i i的正整数的逆元了,所以 j j j的逆元已知。 于是,当 i > 1 i>1 i>1时, i ? 1 ≡ ? ? p i ? ( p % i ) ? 1 ( m o d p ) i^{-1}\equiv -\lfloor\frac{p}{i}\rfloor(p\% i)^{-1} \pmod p i?1≡??ip??(p%i)?1(modp) code
求阶乘的逆元求 1 1 1到 n n n的逆元。同样地,我们也可以用线性的方法来求。 先求出 1 1 1到 n n n的阶乘 s [ i ] s[i] s[i],然后用 O ( l o g ? p ) O(log \ p) O(log?p)的时间复杂度求出 s [ n ] s[n] s[n]的逆元 n y [ n ] ny[n] ny[n] 对于每一个 i ( 1 ≤ i < n ) i(1\leq i<n) i(1≤i<n),因为 1 i ! = 1 ( i + 1 ) ! ? ( i + 1 ) \dfrac{1}{i!}=\dfrac{1}{(i+1)!}*(i+1) i!1?=(i+1)!1??(i+1),所以 n y [ i ] = n y [ i + 1 ] ? ( i + 1 ) % p ny[i]=ny[i+1]*(i+1)\%p ny[i]=ny[i+1]?(i+1)%p 时间复杂度 O ( n + l o g ? p ) O(n+log \ p) O(n+log?p) code
其中 m i mi mi是求快速幂 求任意n各数的逆元先计算出前缀积 s [ i ] s[i] s[i],再求 s [ n ] s[n] s[n]的逆元 n y [ n ] ny[n] ny[n] 与求阶乘的逆元类似,对于每一个 i ( 1 ≤ i < n ) i(1\leq i<n) i(1≤i<n), n y [ i ] = n y [ i + 1 ] ? a [ i + 1 ] % p ny[i]=ny[i+1]*a[i+1]\% p ny[i]=ny[i+1]?a[i+1]%p 那么 a [ i ] a[i] a[i]的逆元就是 s [ i ? 1 ] ? n y [ i ] % p s[i-1]*ny[i]\%p s[i?1]?ny[i]%p,时间复杂度也是 O ( n + l o g ? p ) O(n+log \ p) O(n+log?p) |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 13:00:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |