无数种求逆元的方法总结

乘法逆元

对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n)
一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在 
逆元的含义:模n意义下,1个数a如果有逆元x,那么除以a相当于乘以x。

 

下面给出求逆元的几种方法:

1.扩展欧几里得

给定模数m,求a的逆相当于求解ax=1(mod m)
这个方程可以转化为ax-my=1 
然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组x0,y0和gcd 
检查gcd是否为1 
gcd不为1则说明逆元不存在 
若为1,则调整x0到0~m-1的范围中即可

PS:这种算法效率较高,常数较小,时间复杂度为O(ln n)

 

 

2.费马小定理

在模为素数p的情况下,有费马小定理 
a^(p-1)=1(mod p) 
那么a^(p-2)=a^-1(mod p) 
也就是说a的逆元为a^(p-2)

而在模不为素数p的情况下,有欧拉定理 
a^phi(m)=1(mod m) (a⊥m) 
同理a^-1=a^(phi(m)-1)

因此逆元x便可以套用快速幂求得了x=a^(phi(m)-1)

但是似乎还有个问题?如何判断a是否有逆元呢? 

检验逆元的性质,看求出的幂值x与a相乘是否为1即可

PS:这种算法复杂度为O(log2N)在几次测试中,常数似乎较上种方法大

当p比较大的时候需要用快速幂求解

 

当模p不是素数的时候需要用到欧拉定理

a^phi(p)≡1               (mod p)

a*a^(phi(p)-1)≡1      (mod p)

a^(-1)≡a^(phi(p)-1)  (mod p)

所以
时间复杂度即求出单个欧拉函数的值

(当p为素数的时候phi(p)=p-1,则phi(p)-1=p-2可以看出欧拉定理是费马小定理的推广)

PS:这里就贴出欧拉定理的板子,很少会用欧拉定理求逆元

 

 

3.特殊情况

一:

当N是质数, 
这点也很好理解。当N是质数,0 < a < N时,,则a肯定存在逆元。 
而解出的就满足,故它是a的逆元。

在CF 696C,

求解就灰常方便了…

二:

求逆元一般公式(条件b|a)

ans=a/bmodm=amod(mb)/b

公式证明:

PS:实际上a mod (bm)/b这种的对于所有的都适用,不区分互不互素,而费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求互素,如果a与m不互素,那就没有逆元,这个时候需要a mod (bm)/b来搞(此时就不是逆元的概念了)。但是当a与m互素的时候,bm可能会很大,不适合套这个一般公式,所以大部分时候还是用逆元来搞

4.逆元打表

 

 

有时会遇到这样一种问题,在模质数p下,求1~n逆元 n< p(这里为奇质数)。可以O(n)求出所有逆元,有一个递推式如下

 

                   

 

它的推导过程如下,设,那么

 

       

 

对上式两边同时除,进一步得到

 

       

 

再把替换掉,最终得到

 

       

 

初始化,这样就可以通过递推法求出1->n模奇素数的所有逆元了。

 

另外有个结论的所有逆元值对应中所有的数,比如,那么对应的逆元是

typedef  long long ll;
const int N = 1e5 + 5;
int inv[N];void inverse(int n, int p) {inv[1] = 1;for (int i=2; i<=n; ++i) {inv[i] = (ll) (p - p / i) * inv[p%i] % p;}
}

 

转自:https://blog.csdn.net/guhaiteng/article/details/52123385

更多例题:https://blog.csdn.net/acdreamers/article/details/8220787

 

线性求逆元   题目

ll c(int r,int l) {if (r<l) return 0;return jie[r]*inv[l]%mod*inv[r-l]%mod;
}
int main()
{jie[1] = 1;jie[0] = 1;inv[1] = 1;inv[0] = 1;for(int i = 2; i<=MAX-1; i++) jie[i] = (jie[i-1] * i)%mod;for(int i = 2; i<=MAX-1; i++) {inv[i] = (mod - mod/i*inv[mod%i]%mod)%mod;}
//这两个求逆元的公式都可以使用
//	for (int i=2; i<MAX; i++) {
//		inv[i]=inv[mod%i]*(mod-mod/i)%mod;
//	}
//预处理逆元的前缀积for (int i=2; i<MAX; i++) inv[i]=inv[i-1]*inv[i]% mod;

线性求逆元  题目

const ll mod = 1000000000+7;
const ll N = 300000+5;
const ll M = 3e5+3;
int n;
ll fac[1000005];            //阶乘
ll inv_of_fac[1000005];        //阶乘的逆元
int a[15];
ll dp[150][12];
ll qpow(ll x,ll n)
{ll ret=1;for(; n; n>>=1){if(n&1) ret=ret*x%mod;x=x*x%mod;}return ret;
}
void init()
{fac[1]=1;for(int i=2; i<=M; i++)fac[i]=fac[i-1]*i%mod;inv_of_fac[M]=qpow(fac[M],mod-2);for(int i=M-1; i>=0; i--)inv_of_fac[i]=inv_of_fac[i+1]*(i+1)%mod;//inv_of_fac[i]=qpow(fac[i],mod-2);//为什么不行啊 //也行
}
ll C(ll a,ll b)
{if(b>a) return 0;if(b==0) return 1;return fac[a]*inv_of_fac[b]%mod*inv_of_fac[a-b]%mod;
}

咖啡鸡的求逆元:

#include<bits/stdc++.h>
using namespace std;
const int maxn=4005;
const int E=2000;
typedef long long ll;
const ll M=1000000007;
ll f[maxn],nf[maxn],inv[maxn],dp[2][maxn];
int n,m;
ll C(ll x,ll y){return f[x]*nf[y]%M*nf[x-y]%M;
}
ll K(ll x){return C(x*2,x)*inv[x+1]%M;
}
void add(ll &x,ll y){x+=y; if (x>=M) x-=M;
}
int main(){inv[1]=1; for (int i=2;i<maxn;i++) inv[i]=M-(M/i)*inv[M%i]%M;f[0]=nf[0]=1; for (int i=1;i<maxn;i++) f[i]=f[i-1]*i%M,nf[i]=nf[i-1]*inv[i]%M;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CF#2A】Winner(模拟 STL-map)☆

题干&#xff1a; The winner of the card game popular in Berland "Berlogging" is determined according to the following rules. If at the end of the game there is only one player with the maximum number of points, he is the winner. The situation be…

python两个元组相加_《第5章 Python 列表与元组》5.1.3 序列相加(Adding)!

《高中信息技术 Python编程》 教学案《第5章 Python 列表与元组》 5.1.3 序列相加(Adding)&#xff01;06:151 #使用加号可以进行序列的连接操作&#xff0c;输入如下&#xff1a;2 >>>[1,2,3][4,5,6]3 [1,2,3,4,5,6]4 >>>a[1,2]5 >>>b[5,6]6 >&…

STL之 set简略介绍。

set常用函数及其讲解 构造set集合的主要目的是为了快速检索&#xff0c;使用set前&#xff0c;需要在程序头文件中包含声明“#include<set>”。 set集合容器实现了红黑树&#xff08;Red-Black Tree&#xff09;的平衡二叉检索树的的数据结构&#xff0c;在插入元素时&a…

mysql 按时间查询优化_mysql如何按时间查询优化

mysql按时间查询优化的方法&#xff1a;1、【register_time】字段是datetime类型&#xff0c;转换为日期再匹配&#xff0c;需要查询出所有行进行过滤&#xff1b;2、可以利用在【register_time】字段上建立索引&#xff0c;查询极快。本教程操作环境&#xff1a;windows7系统、…

【HDU - 5688 】Problem D(STL+map)

题干&#xff1a; 度熊所居住的 D 国&#xff0c;是一个完全尊重人权的国度。以至于这个国家的所有人命名自己的名字都非常奇怪。一个人的名字由若干个字符组成&#xff0c;同样的&#xff0c;这些字符的全排列的结果中的每一个字符串&#xff0c;也都是这个人的名字。例如&am…

列举python中常用的数据类型_Python基础知识 变量和简单数据类型

在本章节中&#xff0c;将介绍Python程序中会使用到的各种数据类型&#xff0c;以及如何在程序中使用变量来表示这些数据。其中用到的一些例子均来自《Python编程从入门到实践 第2版》。一、变量1. 变量是标签变量是可以赋给值的标签&#xff0c;也可以说变量指向特定的值。mes…

【HDU - 1412】 {A} + {B} (STL + set)

题干&#xff1a; 给你两个集合&#xff0c;要求{A} {B}. 注:同一个集合中不会有两个相同的元素. Input 每组输入数据分为三行,第一行有两个数字n,m(0<n,m<10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元…

angularjs 开发流程_超级棒的30款web前端开发工具汇总,一定要收藏!

我们与企业内部的Web开发团队进行了很多次交流&#xff0c;研究了很长时间&#xff0c;最后将Debug工具与Web前端开发工具整理汇总在了一起&#xff0c;这些工具对每个Web开发人员都非常有用。这些工具将使您的工作更加轻松&#xff0c;特别是如果您是Web开发人员&#xff0c;W…

*【HDU - 4006】 The kth great number(优先队列 or 线段树)

题干&#xff1a; Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy…

linux mysql io压力大_MySQL 调优基础(四) Linux 磁盘IO_MySQL

1. IO处理过程磁盘IO经常会成为系统的一个瓶颈&#xff0c;特别是对于运行数据库的系统而言。数据从磁盘读取到内存&#xff0c;在到CPU缓存和寄存器&#xff0c;然后进行处理&#xff0c;最后写回磁盘&#xff0c;中间要经过很多的过程&#xff0c;下图是一个以write为例的 Li…

mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)

MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存.你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫.这篇和上一篇都是干货,我也是第一次学.反正我就是这样理解,这样一遍一遍写,一遍一遍看的才慢慢有点感觉的.目前还整理的…

【HDU - 1263】 水果(STL)

题干&#xff1a; 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了. Input 第一行正整数N(0<N<10)表示有N组测试数…

mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

前言MySQL 死锁异常是我们经常会遇到的线上异常类别&#xff0c;一旦线上业务日间复杂&#xff0c;各种业务操作之间往往会产生锁冲突&#xff0c;有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现&#xff0c;并且分析解决时还需要了解 MySQL…

ACM - 欧拉函数(内容)

欧拉函数 &#xff1a; 欧拉函数是数论中很重要的一个函数&#xff0c;欧拉函数是指&#xff1a;对于一个正整数 n &#xff0c;小于 n 且和 n 互质的正整数&#xff08;包括 1&#xff09;的个数&#xff0c;记作 φ(n) 。 完全余数集合&#xff1a; 定义小于 n 且和 n 互质的…

分布式锁和mysql事物扣库存_浅谈库存扣减和锁

先说场景:物品W现在库存剩余1个, 用户P1,P2同时购买.则只有1人能购买成功.(前提是不允许超卖)秒杀也是类似的情况, 只有1件商品,N个用户同时抢购,只有1人能抢到..这里不谈秒杀设计,不谈使用队列等使请求串行化,就谈下怎么用锁来保证数据正确.常见的实现方案有以下几种:1.代码同…

【POJ - 2631 】Roads in the North(树的直径)

题干&#xff1a; Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a village that does not pass through some other village…

齐博php百度编辑器上传图片_php版百度编辑器ueditor怎样给上传图片自动添加水印?...

百度ueditor是广泛使用的所见即所得图文排版编辑插件&#xff0c;功能比较完善&#xff0c;美中不足就是不支持自动加水印。万维景盛工程师搜集到php版ueditor自动加水印的教程&#xff0c;希望对大家有帮助。1.打开ueditor目录下的php目录下的config.json 文件在上传配置项添加…

【HDU - 1285】确定比赛名次 (拓扑排序)

题干&#xff1a; 有N个比赛队&#xff08;1<N<500&#xff09;&#xff0c;编号依次为1&#xff0c;2&#xff0c;3&#xff0c;。。。。&#xff0c;N进行比赛&#xff0c;比赛结束后&#xff0c;裁判委员会要将所有参赛队伍从前往后依次排名&#xff0c;但现在裁判委…

mysql dql_Mysql中的DQL查询语句

欢迎进入Linux社区论坛&#xff0c;与200万技术人员互动交流 >>进入 Mysql中的DQL查询语句 1、查询所有列 --查询 学生 表所有记录(行) select *from 学生 --带条件的查询 select *from 学生 where 年龄19 2、查询指定的列 --查询 所有人的姓名和性别 select 姓名,性欢迎…

【POJ - 1028】 Web Navigation( 栈 or 模拟队列 )

题干&#xff1a; Standard web browsers contain features to move backward and forward among the pages recently visited. One way to implement these features is to use two stacks to keep track of the pages that can be reached by moving backward and forward. …