主要参考: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++ 乘法逆元的更多相关文章

  1. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  2. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  3. 【板子】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 ...

  4. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

  5. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  6. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  7. HDU 1576 (乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...

  8. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  9. hdu 2669 Romantic (乘法逆元)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. HDU3037 Saving Beans(Lucas定理+乘法逆元)

    题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个 ...

随机推荐

  1. Java中的反射以及简单运用(原理+例子)

    Java反射 学习内容 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 字节码对象理解 5. 获取字节码对象(.class)的三种方式 6. 反射常用API 8. 反射综合 ...

  2. js手机号隐藏中间四位

    var tel = "13122223333"; var reg = /^(\d{3})\d{4}(\d{4})$/; tel = tel.replace(reg, "$ ...

  3. numpy---(精简)

    numpy get started 导入numpy库, 并查看版本 import numpy as np np.__version__ '1.14.3' # pyplot显示画图, 数据分析与可视化 ...

  4. springboot+mybatis实现数据分页(三种方式)

    项目准备 1.创建用户表 2.使用spring初始化向导快速创建项目,勾选mybatis,web,jdbc,driver 添加lombok插件 <?xml version="1.0&q ...

  5. Ubu18开机自启动

    Ubu开机自启动 简单示例 在/etc/init.d/目录下新建启动脚本Test #!/bin/bash ### BEGIN INIT INFO # Provides: Test # Required ...

  6. 3道常见的vue面试题,你都会了吗?

    最近流传各大厂纷纷裁员,导致很多人"被迫"毕业,显然很多人还是想留级,无奈出现在名单中,只能感叹命运不公,不过拿了N+1,也算是很欣慰. 又得去面试了,接下来一起来巩固下vue的3 ...

  7. Java学习day8

    今天学习了package,import,final,static和多态 package可以理解为文件夹,因为有些类可能重名,如果在同一个目录下就无法正常实现,所有需要有不同的包来装对应的类 Java出 ...

  8. CTF中的一些图形密码

    1.传统猪圈密码 猪圈密码又称为亦称朱高密码.共济会暗号.共济会密码或共济会员密码:是一种以特定符号来替换字母的加密方式 在线解密网址:http://moersima.00cha.net/zhuqua ...

  9. HCIE-SEC笔记-EVENG模拟器安装

    EVEng模拟器安装: 准备:Vmware 16.0 EVEng EVE-NG-Win-Client-Pack.exe [抓包,内置wireshark,内置vnc,用来打开windows系统] Win ...

  10. PuddingSwap联合 ESBridge举办愚人节“币圈愚话”联合空投活动,完成任务即可获得惊喜奖励

    据官方消息,4月1日0:00- 4月2日23:59,PuddingSwap联合 ESBridge举办"币圈愚话"空投活动,完成任务即可获得惊喜奖励. 此次PuddingSwap联合 ...