逆元的应用

简介: 逆元的应用

1.逆元解释:

逆元定义:

来自一个大佬的通俗解释:

逆元基本应用1

我们知道对于取余运算,有以下性质:

但是唯独除法是不满足的!

现证明除法不满足:

而对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们就需要逆元了

现在就要在回到刚才的问题了,除以一个数等于乘上这个数的倒数,在除法取余的情况下,就是乘上这个数的逆元

这样就把除法,完全转换为乘法了!

逆元的五种求法

1.暴力求解,易理解但是时间复杂度巨大,上代码:

int Inverse_element(int a, int p)
{
    a = a % p;
    int flag = 0;
    int result;
    for (int i = 1; i < 100000; i++)
    {
        flag = 0;
        for (int j = 1; j < 100000; j++)
        {
            if (a * i == 1 + p * j)
            {
                result = i;
                flag = 1;
                break;
            }
        }
        if (flag == 1)
        {
            break;
        }
    }
    return result;
}

2.扩展欧几里得算法

扩展欧几里得算法定义:

模数可以不为质数,满足gcd(a,b)=1即可:

当gcd(a,b)=1时,代入extend_gcd(a,b,x,y),得到的非负的x值,就是上面的a-1

时间复杂度O ( l o g ( n ) ) O(log(n))O(log(n))

ll exgcd(ll a, ll b, ll &x, ll &y)
{
  if (b == 0)
  {
    x = 1, y = 0;
    return a;
  }
  ll d, x1, y1;
  d = exgcd(b, a % b, x1, y1);
  x = y1;
  y = x1 - a / b * y1;
  return d;
}
ll inverse(ll a, ll b, ll &x, ll &y)
{
  if (__gcd(a, b) != 1) return -1;
  else
  {
    exgcd(a, b, x, y);
    return (x % b + b) % b;
  }
}

3.欧拉定理和费马小定理:

欧拉定理在数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互质,则:

φ(n)为欧拉函数(1 − n 中 与 n 互 质 的 数 的 个 数 。 1-n中与n互质的数的个数。1nn(1与任何数互质))。

费马小定理:(只适用于模数为质数的情况 )

n nn为质数且a不为n的倍数时,φ(n)=n-1,所以式子变成:

两边同时除a得:

所以得:

用快速幂求一下,复杂度O ( l o g n ) O(logn)O(logn)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, p;
ll qpow(ll a, ll b, ll mod)
{
  ll ans = 1;
  while (b)
  {
    if (b & 1) ans = (ans * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return ans % mod;
}
int main()
{
  scanf("%d%d", &n, &p);
  for (int i = 1; i <= n; i++)
  {
    cout << qpow(i, p - 2, p) << "\n";
  }
  return 0;
}

4.线性递推逆元(神奇小饼干法)

只适用于模数为质数的情况

当p为质数时有:

证明:

并且inverse[0]=0,inverse[1]=1,递归或循环从2开始

写成算法就是一个递归,到1为止,因为1的逆元就是1。

int inv(int t, int p) {
    return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
}

这个方法复杂度是O(n),但并不是说比前两个差,它可以在O(n)的复杂度内算出n个数的逆元,上面的算法加一个记忆性搜索就行了。

int inv(int t, int p) {
    return INV[t] = t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 19;
typedef long long ll;
ll n, p;
ll ans[N];
int main()
{
  scanf("%d%d", &n, &p);
  ans[1] = 1;
  for (int i = 2; i <= n; i++)
  {
    ans[i] = (p - p / i) * ans[p % i] % p;
  }
  for (int i = 1; i <= n; i++)
  {
    cout << ans[i] << "\n";
  }
  return 0;
}

5.阶乘逆元法

只适用于模数为质数的情况

#include<cstdio>
#define ll long long
using namespace std;
ll mul(ll a,ll b,ll mod) //快速幂模板
{
  ll ans=1;
  while(b)
    {
      if(b&1) ans=ans*a%mod;
      a=(a*a)%mod;
      b>>=1;
    }
  return ans%mod;
}
ll n,p;
ll c[5000010]={1};
ll f[5000010];
int main()
{
  scanf("%lld%lld",&n,&p);
  for(int i=1;i<=n;i++)
    c[i]=(c[i-1]*i)%p;
  f[n]=mul(c[n],p-2,p); //获得inv(n!)
  for(int i=n-1;i>=1;i--) //递推阶乘的逆元
    f[i]=(f[i+1]*(i+1))%p;
  for(int j=1;j<=n;j++) //转化并输出
    printf("%lld\n",(f[j]*c[j-1])%p);
}
目录
相关文章
|
Web App开发 资源调度 JavaScript
竟然可以在一个项目中混用 Vue 和 React?
竟然可以在一个项目中混用 Vue 和 React?
1363 0
|
移动开发 算法 前端开发
|
3月前
|
人工智能 搜索推荐 安全
seo 是啥意思?选对方式 + 看未来发展超简单!
SEO即搜索引擎优化,通过优化网站内容与结构,提升在搜索结果中的排名,获取免费流量。核心是用户体验,需长期投入,白帽为正道。未来SEO将融合AI与多平台搜索,GEO等新机遇涌现,助力品牌曝光与增长。
|
8月前
|
人工智能 缓存 JavaScript
通义灵码深度体验:AI编程助手如何提升全栈开发效率
通义灵码是一款强大的AI编程助手,支持从代码补全到智能体自主开发的全流程辅助。在React+Node.js项目中,其实现了100%字段匹配的Mongoose Schema生成;通过`@灵码`指令,30秒内完成天气查询CLI工具开发,包含依赖管理与文档编写。其上下文记忆能力可自动关联模块逻辑,如为商品模型扩展库存校验。集成MCP服务时,不仅生成基础代码,还推荐最佳实践并添加缓存优化。测试显示,其响应速度快、复杂任务准确率高,适合中小型项目快速迭代,初期开发效率提升约40%。尽管存在文档同步延迟和TypeScript支持不足的问题,仍是一款优秀的AI编程伙伴。
442 7
|
8月前
|
域名解析 网络协议 安全
什么是网络协议
这段内容通过生活中的例子通俗地解释了“协议”的概念。无论是与朋友吃饭的约定、打电话的过程,还是交通规则,都体现了协议的作用——确保双方按照一致的规则行动以避免混乱。在网络世界中,协议同样重要,例如DNS帮助找到网站、HTTP实现数据交互、HTTPS保障信息安全、TCP/IP负责数据传输。这些协议共同保证了设备间高效、有序的信息交流。
539 7
|
3月前
|
域名解析 安全 网络安全
网站安全防护入门:CDN的作用与用法
CDN是网站安全的“智能守护者”,通过隐藏源服务器、过滤恶意流量,有效防御攻击。同时加速访问、减轻服务器压力,提升用户体验。小投入,高回报,为网站筑起安全防线。
559 0
|
5月前
|
人工智能
视频脚本是什么意思?视频脚本怎么写
果和团队协作的基础。它不同于传统文学剧本,更强调视觉呈现与节奏控制,适用于短视频、广告片、Vlog等多种形式
|
安全 Java 数据安全/隐私保护
java JDWP调试接口任意命令执行漏洞
java JDWP调试接口任意命令执行漏洞
930 1
|
8月前
|
传感器 算法 数据安全/隐私保护
基于GA遗传优化的三维空间WSN网络最优节点部署算法matlab仿真
本程序基于遗传算法(GA)优化三维空间无线传感网络(WSN)的节点部署,通过MATLAB2022A实现仿真。算法旨在以最少的节点实现最大覆盖度,综合考虑空间覆盖、连通性、能耗管理及成本控制等关键问题。核心思想包括染色体编码节点位置、适应度函数评估性能,并采用网格填充法近似计算覆盖率。该方法可显著提升WSN在三维空间中的部署效率与经济性,为实际应用提供有力支持。
|
10月前
|
设计模式 网络协议 Java
04.里式替换原则介绍
里式替换原则(LSP)是面向对象设计的重要原则之一,确保子类可以无缝替换父类而不破坏程序功能。本文详细介绍了LSP的定义、背景、理解方法及应用场景,通过电商支付和鸟类飞行案例展示了如何遵循LSP,并分析了其优缺点。LSP强调子类应保持父类的行为一致性,有助于提高代码的可扩展性、可维护性和可重用性,但也可能导致过度设计。最后,对比了LSP与多态的区别,明确了LSP作为设计原则的重要性。
390 4