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. 这个方程的非负整数解个 ...
随机推荐
- numpy教程06---ndarray的进阶操作
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- 51单片机I/O引脚IO口工作原理
51单片机I/O引脚IO口工作原理 一.51单片机管脚p0.p1.p2.p3口区别如下: 1.意思不同P0口作输出口用时,需加上拉电阻.P0口有复用功能.当对外部存储器进行读写操作时,P0口先是提供外 ...
- 20202127 实验二《Python程序设计》实验报告
20202127 2021-2022-2 <Python程序设计>实验二报告 课程:<Python程序设计>班级: 2021姓名: 马艺洲学号:20202127实验教师:王志强 ...
- Antd Modal 可拖拽移动
一 目标: 实现antd Modal 弹窗或者其他弹窗的点击标题进行拖拽的效果 二 准备及思录: 1.使用antd Modal 组件,要想改变位置需要改变Modal style 的left 和top ...
- Visual Studio 修改NuGet 包缓存路径
Visual Studio 下载的NuGet包默认会缓存到 C:\Users{Windows用户名}.nuget\packages 下,时间一长就会导致 C盘空间严重不足. 那么怎样去设置,让包缓存文 ...
- 【已解决】Redis错误:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。
报错:redis服务在window下启动,报错: Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成. ...
- 【科普】为什么ip地址通常以192.168开头?
开源Linux 回复"读书",挑选书籍资料~ 我们做运维的,与ip地址接触最多,无论是运维的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢? ...
- 【原创】记一次对X呼APP的渗透测试
获取CMS并本地安装 X呼是一款开源的客服CMS系统,访问官网,下载安卓版本的app和源码本地搭建: 发现这cms预留admin表中的用户就不少.... 直接用预留的密码解密,然后就能登录手机APP了 ...
- mysql5.6 innodb_large_prefix引起的一个异常
phenomenon: Specified key was too long; max key length is 3072 bytes 在修改一个数据库字段时,字段容量被限制为了表前缀的大小而不是本 ...
- selenium模块 phantomJs 谷歌无可视界面
参考微博: 什么是selenium 一款基于浏览器自动化的模块 什么是浏览器自动化 通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中 ...