本博客部分摘自   hwim

定义

乘法逆元的定义:若存在正整数a,b,p, 满足ab = 1(mod p), 则称a 是b 的乘法逆元, 或称b 是a 的乘法逆元。b ≡ a-1 (mod p),a ≡ b-1 (mod p)

比如说, 在模7 意义下,3 的乘法逆元是5, 也可以说模7 意义下5的乘法逆元是3。模13意义下5的逆元是8

存在性

和同余方程很相似,在同余方程中

ab ≡ 1(mod p)

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

所以逆元要求a与p互质

求法

求逆元有三种求法,

1、扩展欧几里得

扩展欧几里得可以用来求这样的一组解的:ax+by = gcd(a,b),求x和y

逆元,求这样的一个解:ax ≡ 1 (mod b),

我们变一下式子

ax+by = gcd(a,b),变成 ax+by = c 求一个数等于c

ax ≡ 1 (mod b),变成 ax-by = 1 如果将y看成负的,ax+by = 1

那么,就可以用exgcd求了。

code:

#include<cstdio>

int exgcd(int a,int b,int &x,int &y)
{
if (b==)
{
x = ;
y = ;
return a;
}
int r = exgcd(b,a%b,x,y);
int tmp = x;
x = y;
y = tmp-a/b*y;
return r;
} int main()
{
//gcd(a,p)==1
int a,p,r,x,y;
while (scanf("%d%d",&a,&p)!=EOF)
{
r = exgcd(a,p,x,y);
printf("%d",(x%p+p)%p);
}
return ;
} 扩展欧几里得求逆元

exgcd

2、线性求逆元

ab = 1(mod p),求b

p%a = p-(p/a)*a;c++向下取整

那么(p/a)*a = p-(p%a);

(p/a)*a = -(p%a);在模p意义下p可以约掉

a = -(p%a)/(p/a);换一下位置

a-1 = -(p%a)-1*(p/a);

a-1可以用(p%a)-1推出,所以就可以用递推式来推出1到a的所有数的逆元。

code

求一个数的逆元

int INV(int a)//线性求a的逆元
{
if(a==) return ;
return ((-(p/a)*INV(p%a))%p);
}

求1-n的逆元

int inv[MAXN];
void INV(int a,int p)
{
inv[] = ;
for (int i=; i<=a; ++i)
inv[i] = (-(p/i))*inv[p%i]%p;
}

线性求逆元1

3、欧拉函数求逆元

欧拉定理:aφ(p) ≡ 1(mod p)(不会证,逃

对于任意互质的a,p 恒成立。

欧拉定理用来求逆元用的是欧拉定理的一个推论
a*aφ(p)-1 ≡ 1(mod p)

仔细观察,a*b ≡ 1(mod p),在这里的b不就是上面的aφ(p)-1吗?,所以求出aφ(p)-1就好了。

所以我们用快速幂就可以求出乘法逆元了。

这个方法它需要多算一个欧拉函数,代码这里不再给出。

这里给出求欧拉函数O(根n)的做法

不懂欧拉的戳这里11101001

int getphi(int x){
int ret=;
for(int i=;prime[i]*prime[i]<=x;i++){
if(x%prime[i]==)
{
ret*=prime[i]-;
x/=prime[i];
while(x%prime[i]==)
x/=prime[i],ret*=prime[i];
}
}
if(x>) ret*=x-;
return ret;
}

V欧拉

应用

我们知道(a+b)%p = (a%p+b%p)%p

    (a*b)%p = (a%p)*(b%p)%p

求(a/b)%p时,可能会因为a是一个很大的数,不能直接算出来,也无法像上面一样分解。

我们可以通过求b关于p的乘法逆元k,k ≡ b-1 (mod p) ,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。

然后这就成了求a*k%p,然后就可以用那两个公式了。

 

about乘法逆元的更多相关文章

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

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

  2. 51nod1256(乘法逆元)

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

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

  4. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

  5. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  6. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  7. HDU 1576 (乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...

  8. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  9. hdu 2669 Romantic (乘法逆元)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. HDU3037 Saving Beans(Lucas定理+乘法逆元)

    题目大概问小于等于m个的物品放到n个地方有几种方法. 即解这个n元一次方程的非负整数解的个数$x_1+x_2+x_3+\dots+x_n=y$,其中0<=y<=m. 这个方程的非负整数解个 ...

随机推荐

  1. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  2. Linux 关于SELinux的命令及使用

    1. 模式的设置 : 修改/etc/selinux/config文件中的SELINUX=”" 的值 ,然后重启.enforcing:强制模式,只要selinux不允许,就无法执行 permi ...

  3. Linux学习-systemctl 针对 service 类型的配置文件

    systemctl 配置文件相关目录简介 现在我们知道服务的管理是透过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/system/ 目录内. 该目录的 ...

  4. luogu3386 【模板】二分图匹配 匈牙利算法 hdu2063 过山车 dinic

    luogu 匈牙利算法 #include <iostream> #include <cstring> #include <cstdio> using namespa ...

  5. 理解Linux虚拟文件系统VFS

    当前,除了linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统 ...

  6. TOJ2680: 最大矩阵连乘次数

    2680: 最大矩阵连乘次数  Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByteTotal Submit: 144 ...

  7. Oracle的表空间、数据文件、用户

          每一个Oracle数据库都是由三种类型的文件组成:数据文件(Data File).日志文件(Log File)和控制文件(Control File).数据库的文件为数据库信息提供真正的物理 ...

  8. 九度oj 题目1466:排列与二进制

    题目描述: 在组合数学中,我们学过排列数.从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n中取m的排列数,记为p(n, m).具体计算方法为p(n, m)=n(n-1)(n-2 ...

  9. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  10. 【Luogu】P2599取石子游戏(博弈论)

    题目链接 情况非常复杂,事实上题解我现在也没有完全理解 不过大致的意思就是 设两个数组lef[][],rig[][]表示对应区间左端加一堆数量为lef[][]的石子使得先手必败,rig同理 可以通过一 ...