逆元的应⽤
求解 ( a/b )%m 时 ⼀般想法是 转化为(a%(b*m))/b,转化过程如下
令k = (a/b)/m(向下取整), x = (a/b)%m;
a/b = k*m + x (x < m);
a = k*b*m + b*x;
a%(b*m) = b*x;
a%(b*m)/b = x;
得证: a/b%m = a%(b*m)/b;(公式适⽤于很多情况:m不必是素数,b和m也不必互质)
wcg2010世界总决赛上⾯的公式适⽤于b较⼩,a需要在线求且较⼤的时候;
⽐如:求a/b的值,且另a = x^k, 求a的过程随时会爆精度所以需要对a进⾏取模,但是求的过程中如果是 直接对a进⾏%mod,之后再进⾏a/b,会出现错误的。正确的做法是根据上述公式,在求a过程中对(b*m)取模,之后再除以⼀次b即可。[ a/b%m = (a%(b*m))/b%m ]
所有的除法取模问题都可以⽤这种⽅法,但是当b很⼤的时候,则会出现爆精度问题,所以引出乘法逆元,将除法取模转换为乘法取模。 b存在乘法逆元的充要条件是b与模数m互质。
设令c为b的逆元,即b*c ≡ 1(mod m);
解释:满⾜同余⽅程,b*c和1对m的模数相同,即b*c对m取余为1(m > 1);
xscale那么 a/b = (a/b)*1 = (a/b)* ( (b*c)(mod m) ) = a*c(mod m);品
kugoo2013下载即,除以⼀个数对m取模等于乘以这个数的逆元对m取模;
三种求逆元的⽅法&:
1.逆元求解利⽤扩欧。
2.当m为质数的时候直接使⽤费马⼩定理,m⾮质数时使⽤欧拉函数。 3.当m为质数的时候,使⽤神奇的线性⽅法。
扩展&:
1.利⽤乘法逆元求解组合数及组合数的其它求法。
基础教育参考2.线性时间求阶乘的逆元。
碱含量有兴趣的的话就去搜搜博客⾃学吧,博主以后再⼀⼀补上。