逆元基础知识

定义:对于正整数a和m,如果有 ax=1(mod m),那么把这个同余方程中x的最小正整数解叫做a模m的逆元。

求法:1.扩展欧几里得

        2.根据费马小定理得到逆元为a^(m-2) mod m。

        证明:当m是素数时,由费马小定理

        a^(m-1)=1(mod m)

  => a^(m-2)*a=1(mod m)

  => a^(m-2)=a^-1(mod m)

所以:a^(m-2)mod m 是a在mod m下的逆元。

问题:ans=(a/b)mod m

         当a与m互素时,可以用exgcd或费马小定理(m是素数),实际上还有一种一般求解方法:

         ans = (a/b)mod m = amod(mb)/b

         证明:a/b=km+x

                 a=kbm+bx

                 amod(bm)=bx

                 amod(bm)/b=x

                (a/b)mod m = amod(bm)/b

      有些问题需要求解1->p模p的所有逆元,这里p为奇质数。那么如果用快速幂求时间复杂度为O(p*logp),

如果对于一个1000000级别的素数,这样做的时间复杂度是很高了。实际上有O(p)的算法,有一个递推式如下:

       inv[i]=(M-M/i)*inv[M%i]%M

       证明:设t=M/i,k=M%i,那么

           => t*i+k=0(mod M)

           => -t*i=k(mod M)

           对上式两边同时除,进一步得到

           -t*inv[k]=inv[i](mod M)

           再把t和k替换掉,最终得到

           inv[i]=(M-M/i)*inv[M%i]%M

           初始化inv[i]=1,这样就可以通过递推求出1->p模奇素数p的所有逆元了。

            另外1->p模p的所有逆元值对应中1->p所有的数,比如p=7,那么1->6对应的逆元是1 4 5 2 3 6。

 两个例题:poj1845,bzoj2186

原文地址:https://www.cnblogs.com/harden/p/6262978.html