博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求逆元的四种办法
阅读量:7190 次
发布时间:2019-06-29

本文共 1246 字,大约阅读时间需要 4 分钟。

2018-03-17 12:06:26

还有一个半小时就开始天梯赛排位赛了 一个小时 看看求逆元吧 在补zoj2018三月赛C题的时候遇到的 之前遇见数学题基本上都是选择性略过的

感谢http://blog.csdn.net/guhaiteng/article/details/52123385

四种办法 例如 a/b%p 总结一下求逆元的适用情况 (是否要求a、b互质  是否要求p为质数  数据多大的时候可以用)  时间复杂度

这里不讲原理 原理原博客介绍的很详细 只讲应用

逆元存在的充分必要条件是a p互质

逆元的含义 在模n意义下 一个数a如果有逆元x 那么除以a相当于乘以x

一. 扩展欧几里得

不要求p为质数

效率较高 常熟较小 时间复杂度ln n 

typedef  long long ll;  void extgcd(ll a,ll b,ll& d,ll& x,ll& y){      if(!b){ d=a; x=1; y=0;}      else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }  }  ll inverse(ll a,ll n){      ll d,x,y;      extgcd(a,n,d,x,y);      return d==1?(x+n)%n:-1;  }

  

二. 费马小定理

时间复杂度log2n 常数上比上一种办法大 几乎很少会用费马小定理求逆元

typedef  long long ll;  ll pow_mod(ll x, ll n, ll mod){      ll res=1;      while(n>0){          if(n&1)res=res*x%mod;          x=x*x%mod;          n>>=1;      }      return res;  }

 三. 求逆元的一般公式

上两种办法都要求a与p互质 

这种办法不要求互不互质  但是当a与p互质的时候b*p可能会很大 因此就需要用前两种办法来解决  不互质的时候考虑这种办法 效率较高

ans = (amodp*b)/b

四. 逆元打表

这种办法适用于求一个范围内所有数字的逆元

有一个递推公式

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;      }  }

之前对于分数取模也一直不理解 后面学习了这个发现 分数取模其实就是a*(b在p下的逆元)%p

转载于:https://www.cnblogs.com/Flower-Z/p/8568732.html

你可能感兴趣的文章
hibernate.cfg.xml配置
查看>>
将零散文件使用ICSharpCode.SharpZipLib压缩打包后一次性下载
查看>>
Python 爬取简单网页
查看>>
【机器学习】--xgboost初始之代码实现分类
查看>>
【强化学习篇】--强化学习从初识到应用
查看>>
获取图片
查看>>
过滤器
查看>>
软件工程个人作业02(四则运算)
查看>>
jQuery自动完成点击html元素
查看>>
关于随机数
查看>>
《世界是数字的》读书笔记
查看>>
LeetCode开心刷题第七天——13RomanToInteger14 Longest Common Prefix
查看>>
php中直接执行mysqli_init()也是报Property access is not allowed yet的错误。
查看>>
领导讲话笔记 记录(游戏编辑器)
查看>>
"ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库。...
查看>>
Django Model 基础数据库操作应用
查看>>
Java ConcurrentModificationException异常原因和解决方法[转载]
查看>>
单例模式防止反射和反序列化
查看>>
聚集索引和非聚集索引的区别
查看>>
搭建前端监控系统(备选)用户行为统计和监控篇(如何快速定位线上问题)...
查看>>