逆元:

丢线

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. Kafka集群安装及prometheus监控

    前提 zookeeper安装参考:https://www.cnblogs.com/JustinLau/p/11372782.html 其他安装参考:https://www.cnblogs.com/lu ...

  2. 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用

    模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理.分类及应用 lqfarmer 深度学习研究员.欢迎扫描头像二维码,获取更多精彩内容. 946 人赞同了该文章 Atte ...

  3. poj 2915

    #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...

  4. java 框架-缓冲-Redis 2Jedis操作

    https://www.cnblogs.com/wlandwl/p/redis.html Redis介绍及Jedis基础操作   1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数 ...

  5. sql 视图的用法

    在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的需要使用中间表来进行数据连接,有的同学就说了,我可以采用Hibernate进行主外键进行关联啊?多对多,多对一,一对一,等,采用主外键关联 ...

  6. JS基础 sessionStorage

    html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...

  7. TypeScript入门七:TypeScript的枚举

    关于枚举 数字枚举 字符串枚举 异构枚举 计算的和常量成员 运行时的枚举与反向映射 常量枚举与外部枚举 一.关于枚举 枚举:一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计 ...

  8. Java 面向对象(四)继承

    一.继承的概述(Inherited) 1.由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 其中,多个类可以称为 子类(派生类 ...

  9. gitlab自动化部署CI案例

    参考: https://blog.csdn.net/hxpjava1/article/details/78514999   (简单操作) https://blog.csdn.net/wh211212/ ...

  10. go语言interface学习

    Go 中的 interface 所具有的最基本的功能:作为一种 abstract type,实现各种 concrete type 的行为统一. interface是一种类型.只有是实例化后才能调用in ...