本文共 1696 字,大约阅读时间需要 5 分钟。
原始链接:[](https://blog.csdn.net/weixin_43872728/article/details/99687168?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159788598219725211921229%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159788598219725211921229&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-4-99687168.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83&spm=1018.2118.3001.4187)
逆元:在数论中称倒数为逆元。
求余:
(a + b) % p = (a%p + b%p) %p (对)
(a - b) % p = (a%p - b%p) %p (对)
(a * b) % p = (a%p * b%p) %p (对)
(a / b) % p = (a%p / b%p) %p (错)
ps: (100/50)%20 = 2 ≠ (100%20) / (50%20) %20 = 0
对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们是不是对这个算式就无法计算了呢?
如果
a*x = 1
那么x是a的倒数,x = 1/a
但是a如果不是1,那么x就是小数
那数论中,大部分情况都有求余,所以现在问题变了
a*x = 1 (mod p)
那么x一定等于1/a吗
由前面我们推得的求余的概念,算式中出现了除法,那么x不一定等于1/a。
所以说数论中的逆元与常说的倒数之间的差别就在于逆元多了一个求余条件,所以x叫做a关于p的逆元。
总结起来就是
求 (A / B) %p ;在B的值非常大的情况下,B作为除数,极有可能会爆精度;除数不能太大;所以我们可以把他转化为乘法来解决;
必不可少的板子:
扩展欧几里得算法求逆元:
long long extend_gcd(long long a,long long b,long long &x,long long &y) { if(a==0&&b==0) return -1ll; if(b==0) { x=1ll; y=0ll; return a; } long long d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d;}long long mod_reverse(long long a,long long n) { long long x,y,d=extend_gcd(a,n,x,y); if(d==1) { if(x%n<=0)return x%n+n; else return x%n; } else return -1ll;}
费马小定理+快速幂求逆元
long long PowMod(long long a,int b) { long long ret=1; while(b) { if(b&1)ret=ret*a%Mod; a=a*a%Mod; b>>=1; } return ret;}