Skip to main content

模逆元

参考资料

定义

如果线性同余方程 ax1(modp)ax\equiv 1\pmod p,则 xx 称为 aa 在模 pp 意义下的 逆元(Inverse),记为 x=a1x=a^{-1}

快速幂法

根据费马小定理(Fermat's Little Theorem):

aap2=ap11(modp)aa^{p-2}=a^{p-1}\equiv 1\pmod p x=ap2x=a^{p-2}

快速幂:Pow(a,mod-2)

详见 快速幂

扩展欧几里得算法

如果 ax1(modp)ax\equiv 1\pmod p,说明存在整数 x,yx,y 满足 ax+py=1ax+py=1

扩展欧几里得算法:exgcd(a,mod)

详见 最大公约数

线性逆元

pmodi=ppiipmodipii(modp)i1(pmodi)pi(modp)i1pi(pmodi)1(modp)\begin{aligned} & p\bmod i=p-\left\lfloor\frac{p}{i}\right\rfloor\cdot i \\ & p\bmod i\equiv-\left\lfloor\frac{p}{i}\right\rfloor\cdot i\pmod p \\ & i^{-1}\cdot(p\bmod i)\equiv-\left\lfloor\frac{p}{i}\right\rfloor\pmod p \\ & i^{-1}\equiv-\left\lfloor\frac{p}{i}\right\rfloor(p\bmod i)^{-1}\pmod p \end{aligned}
98 Bcpp
ll inv[N];
void init()
{
for(int i=1;i<N;i++)
{
inv[i]=i==1?1:(mod-mod/i)*inv[mod%i]%mod;
}
}

例题

给定两个整数 n,pn,p,求 1n1\sim n 中所有整数在模 pp 意义下的乘法逆元。(n3×106,n<p<20000528n\le3\times10^6,n<p<20000528

保证 pp 是质数。

给定 nn 个正整数 aia_i,求它们在模 pp 意义下的乘法逆元。

由于输出太多不好,所以将会给定常数 kk,你要输出的答案为:

i=1nkiai\sum\limits_{i=1}^n\frac{k^i}{a_i}

答案对 pp 取模。

给出一个有理数 c=abc=\frac{a}{b},求 cmod19260817c \bmod 19260817 的值。

这个值被定义为 bxa(mod19260817)bx\equiv a\pmod{19260817} 的解。

求同余方程 ax1(modb)ax\equiv1\pmod b 的最小正整数解。(a,b2×109a,b\le2\times10^9