逆元:

丢线

1.首先定义:

  若存在正整数a,x,m,且满足ax≡1(mod m),则称a是x的乘法逆元,或称x是a的乘法逆元.

Eg:

  模7意义下,3的乘法逆元是5(或模7意义下,5的乘法逆元是3)

  1)3*1%7=3%7=3   =/=1(x)

  2)3*2%7=6%7=6   =/=1(x)

  3)3*3%7=9%7=2   =/=1(x)

  4)3*4%7=12%7=5 =/=1(x)

  5)3*5%7=15%7=1 ==1 (√)

        ||

        ||

        ||

        v

  模7意义下,3的乘法逆元是5(或模7意义下,5的乘法逆元是3)

其他的求乘法逆元的方式与此类似。

2.乘法逆元存在性定理

我们来考虑一下同余方程:

    ax ≡ 1(mod m)

若a 与m 互质, 则一定存在一个正整数解x, 满足x < m.
若a 与m 不互质, 则一定不存在正整数解x.

意思也就是说, 互质与乘法逆元存在互为充要条件.

3.求法

  ①欧拉定理/费马小定理

  •   3.1欧拉定理

    •   3.1.1欧拉定理公式:

            aφ(p) ≡ 1(mod p)

          (是对于任意互质的a,p恒成立的)

    •   3.1.2推论

        a*aφ(p)-1 ≡ 1(mod p)

        只有通过这个公式+快速幂才能够求逆元~

    •   3.1.3欧拉函数定义

        欧拉函数φ(n)表示小于等于n且与n互质的正整数的个数

          Eg:φ(6)=2,φ(7)=6,φ(1)=1

       欧拉函数是一个数论函数, 也是一个积性函数, 可以线性筛出.

  • 3.1.4欧拉函数公式:

    若令n=∏ki=1 pi ci为n的质因子分解形式,则有

              k   pi-1

          φ(n)=n∏  ----------

             i=1    pi

欧拉函数可以利用容斥原理在O(sqrt(n))的时间复杂度上界中求出

  ②线性求逆元

  ③拓展欧几里得

逆元一般用拓展欧几里得算法来求得,如果为素数(常用素数有:998244353,1000000007),则经常根据费马小定理(用于降低题目的难度)得到逆元为

其推导过程如下:                

例:

求如下表达式的值(已知)(|为整除号)

当然这个经典的问题有很多方法,最常见的就是扩展欧几里得,如果是素数,还可以用费马小定理!!!

但是你会发现费马小定理和扩展欧几里得算法求逆元是有局限性的,它们都会要求互素。实际上我们还有一种通用的求逆元方法,适合所有情况。

公式如下:

现在我们来证明它,已知,证明步骤如下

而对于(a/b)%m== 一个数

  1.当m是素数的时候,根据费马小定理(不懂的可以去这儿看看),直接输出b^(n-2)即可

  2.否则,就根据拓展欧几里得exgcd(b,m,x,y)

    Ps:拓展欧几里得能够保证求出的x,y满足|x|+|y|最小

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std;
int a,b,m;
int x,y; int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;
y=;
return a;
}
int r=exgcd(b,a%b,x,y),tmp;
tmp=x,x=y;
y=tmp-a/b*y;
return r;
} int fastpow(int a,int p)
{
int bb=a;int ans=;
while(p!=)
{
if(p%==)ans=ans*bb;
bb=bb*bb;
p=p/;
}
return ans;
} int main()
{
scanf("%d%d%d",&a,&b,&m);
for(int i=;i<=sqrt(m);i++)
{
if(m%i==)
{
int ans=exgcd(b,m,x,y);
printf("%d",(a*ans)%m);
return ;
}
}
printf("%d",fastpow(b,m-));
}

逆元 x的更多相关文章

  1. hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)

    xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,··· ...

  2. HDU 5976 数学,逆元

    1.HDU 5976 Detachment 2.题意:给一个正整数x,把x拆分成多个正整数的和,这些数不能有重复,要使这些数的积尽可能的大,输出积. 3.总结:首先我们要把数拆得尽可能小,这样积才会更 ...

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

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

  4. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  5. 51nod1256(乘法逆元)

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

  6. O(n)求1-n的逆元

    转自:http://www.2cto.com/kf/201401/272375.html 新学的一个求逆元的方法: inv[i] = ( MOD - MOD / i ) * inv[MOD%i] % ...

  7. NOIP2011多项式系数[快速幂|组合数|逆元]

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

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

  9. 【HDU 5698】瞬间移动(组合数,逆元)

    x和y分开考虑,在(1,1)到(n,m)之间可以选择走i步.就需要选i步对应的行C(n-2,i)及i步对应的列C(m-2,i).相乘起来. 假设$m\leq n$$$\sum_{i=1}^{m-2} ...

  10. 【BZOJ-2839】集合计数 容斥原理 + 线性推逆元 + 排列组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 229  Solved: 120[Submit][Status][Discuss] ...

随机推荐

  1. IDEA GIT 忽略文件 最佳方式

    前言 转载一篇博客,简单,实用. 原文地址:intellij idea 忽略文件不提交 ps:下面均为转载博客的内容: 在intellij中忽略提交文件,分两种情况, 文件没有纳入版本管理 第一种,文 ...

  2. Idea 使用 Junit4 进行单元测试

    目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...

  3. Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  4. modelsim仿真xilinx ram输出均为0

    现象 在vivado2018.3下生成了RAM IP,丢到modelsim中仿真发现doutb输出均为0.调整AB端口的时钟速率,发现低于5ns不行,输出为0.但5ns以上正常. 解决方法 比对了vi ...

  5. S2-016、S2-017

    前言 由于S2-016.S2-017出现的原因时相同的,只是由于poc不一样,造成了不同的攻击.S2-016是RCE,S2-017是开发型重定向漏洞.这里将两个漏洞放一起分析.另外“Struts2系列 ...

  6. nuxt中全局引入element-ui

    介绍 对于一个前端小白来说,使用一套已有的框架作为基础,可以达到事半功倍的效果,在这里我们选择Element.Element,一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库( ...

  7. 【SpringMVC】入门

    一.概述 1.1 SpringMVC是什么 1.2 MVC在b/s系统的应用 1.3 SpringMVC 原理 二.入门程序 2.1 需求 2.2 引入依赖 2.3 前端控制器 2.4 springm ...

  8. KubeEdge v0.2发布,全球首个K8S原生的边缘计算平台开放云端代码

    KubeEdge开源背景 KubeEdge在18年11月24日的上海KubeCon上宣布开源,技术圈曾掀起一阵讨论边缘计算的风潮,从此翻开了边缘计算和云计算联动的新篇章. KubeEdge即Kube+ ...

  9. java之rpc/orm

    Netty线程模型 其中ChannelPiepline的设计模型采用的是Handler组成的责任链模型 blocking I/O 阻塞nonblocking I/O 非阻塞I/O multiplexi ...

  10. MySQL进阶2 sql选择语句 where

    与SQL语句一致 #进阶2: 条件查询 /* 语法 select 查询列表 #3 from 表名 #1 where 筛选条件; #2 分类: 1.按条件表达式进行筛选 > < = != & ...