c++ 乘法逆元
主要参考:OI-WIKI
为什么要逆元
当一个题目让你求方案数时常要取余,虽然
\((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\)
但是
\((\dfrac{a}{b})\%p\ne(\dfrac{a\%p}{b\%p})\%p\)
由于会出现这种情况,所以就要逆元了
一般情况下,当\(ax=1\)时,x 是 a 的倒数,\(x=\dfrac{1}{a}\)
毕竟是取余,所以当\(ax\equiv 1\pmod p\)时, x 叫做 a 关于 p 的逆元,用 \(a^{-1}\) 表示
于是 \((\dfrac{a}{b})\%p=(a\%p\times b^{-1}\%p)\%p\)
这样就把除法转换成乘法,解决了问题
如何求逆元
前提:\(\gcd(a,p)=1\) (本蒟蒻现在才发现模数这么奇怪原来有意图,如)
费马小定理
\(\because a^p\equiv a\pmod p \\ \therefore a^{p-2}\equiv\dfrac{1}{a}\pmod p\)
证明:OI-WIKI(蒟蒻不会)
所以说\(a^{-1}\equiv a^{p-2}\pmod p\)
复杂\(O(\log p)\)
扩展欧几里得
\(ax+py=1\)的一组解 (x,y) ,x 是 a 关于 p 的逆元, y 是 p 关于 a 的逆元
证明:两边同时模 p
\(\ \ \ \ \ \ \ \ \ \ \ ax+py=1\\ ax\%p+py\%p=1\%p\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ax\%p=1\%p\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ax\equiv 1\pmod p\)
所以 x 是 a 关于 p 的逆元,反之可以证明 y
复杂\(O(\log p)\)
连续的逆元
连续的逆元
如果直接暴力求,效率低,很有可能超时,如何线性(\(O(n)\))求呢?
首先 \(1^{-1}\equiv 1\pmod p\)
然后,设 \(p=k*i+r,r<i,l<i<p\) ,放到\(\pmod p\) 下就成了 \(k*i+r\equiv 0\pmod p\)
两边同时乘上\(i^{-1}\)和\(r^{-1}\)可得
\(k*i*i^{-1}*r^{-1}+r*i^{-1}*r^{-1}\equiv 0\pmod p\)
\(\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ k*r^{-1}+i^{-1}\equiv 0 \pmod p\)
\(\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i^{-1}\equiv -k*r^{-1}\pmod p\)
\(\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i^{-1}\equiv -\lfloor\dfrac{i}{p}\rfloor*(p\mod i)^{-1} \pmod p\)
于是就可以从前面推出当前的逆元了,\(A[1]=1,A[i]=(p-p/i)*A[p\%i]\)
用 \(p-\lfloor\dfrac{p}{i}\rfloor\)防止出现负数,时间复杂度\(O(n)\)
阶乘的逆元
可以先处理 \(n!\) 的逆元,可以发现对于一个 \(1\le i<n\),都有\(\dfrac{1}{i!}=\dfrac{1}{(i+1)!}*(i+1)\)
所以 \(i!\)的逆元\(A[i]=A[i+1]*(i+1)\%p\),A[n] 先求出来,时间复杂度\(O(\log p+n)\)
求任意 n 个数的逆元
先算出前缀积 \(s_i\) 并预处理出 \(s_n\) 的逆元 \(sv_n\) ,
与阶乘的逆元相同,\(sv_i=sv_{i+1}*a_{i+1}\%p,1\le i<n\) 用这种抵消的方法可以\(O(n)\)处理出\(sv\)
求出了\(sv\),\(a_i^{-1}\)可以用\(s_{i-1}*sv_i\)求得,时间复杂度\(O(\log p+n)\)
c++ 乘法逆元的更多相关文章
- Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...
- 51nod1256(乘法逆元)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...
- 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...
- HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- HDU 1452 (约数和+乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...
- HDU 1576 (乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...
- 51Nod 1256 乘法逆元 Label:exgcd
1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...
- hdu 2669 Romantic (乘法逆元)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU3037 Saving Beans(Lucas定理+乘法逆元)
题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个 ...
随机推荐
- Java中有关clone方法的用法
一.clone在数组基本数据类型中的使用 public class Main { public static void main(String[] args) { int[] arr= {7,8,9} ...
- Visual Studio 打包和安装 exe
# Visual Studio 打包和安装 exe > **小型项目(无复杂的库)** //VS2022 作为演示平台 > 1.解决方案配置 = Release > 2.解决 ...
- nmtui 工具使用的话,需要开启NetworkManager(网卡文件不存在ens192)
环境采样: [root@k3master network-scripts]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) ...
- allure用法(一)-配置信息及基本用法
allure是一个轻量级的,灵活的,支持多语言的测试报告工具 优点: 可以为dev/qa 提供 详尽的测试报告.测试步骤.日志 可以为管理层提供更好的统计报告 Java语言开发的 可以集成到jenki ...
- 2021.08.05 P1340 兽径管理(最小生成树)
2021.08.05 P1340 兽径管理(最小生成树) P1340 兽径管理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.离线化. 题意: 有n个点,m条边,每次加 ...
- 小程序开发之获取客户来源 scene 场景值 手机设备信息
为什么要获取客户来源 用作数据分析,根据客户来源,做精准转化! 判断客户来源入口方式 1.通过官方的scene场景值 常见场景值 场景值ID 说明 1001 发现栏小程序主入口,「最近使用」列表 10 ...
- 【2022.04.19】Docker-compose一键安装mirai,搭建QQ机器人最快方法
先用官方的脚本安装下docker curl -sSL https://get.docker.com/ | sh 安装docker-compose curl -L "https://githu ...
- 3.1 常用Linux命令
1.echo命令 echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为"echo [字符串] [$变量]". 2.date命令 date命令用于显示或设置系统的时间与 ...
- 【题解】金牌导航-高斯消元/Luogu P3232 游走
题目描述: 详细分析: 我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号. 那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定 ...
- 软件包管理-yum私有仓库
Linux软件安装 包的依赖关系: 软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包 安装软件包时,会因为缺少依赖的包,而导致安装包失败. 解决依赖包管理工具: ...