模运算MOD性质

模运算(MOD)的性质总结


基础性质

  • 加法:$ (a + c) \equiv (b + d) \pmod m $
  • 减法:$ (a - c) \equiv (b - d) \pmod m $
  • 乘法:$ (a \times c) \equiv (b \times d) \pmod m $
  • 幂运算:$ a^k \equiv b^k \pmod m $
  • 归正: $ ( x \text{ % } m + m ) \text{ % } m $

特别注意:除法不满足直接约去! : 即 $ a \times c \equiv b \times c \not\Rightarrow a \equiv b $, 除非 $ \gcd(c, m)=1 $


逆元

OI-Wiki 模意义下的乘法逆元


费马小定理

示例代码

using ll = long long; // 十年 OI 一场空, 不开 long long 见祖宗

// 快速幂板子
ll pow(ll a, ll b, ll mod) { 
    ll res = 1;         
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

// 费马小定理求逆元, mod 必须为质数且 a 不是 mod 的倍数
ll inv_fermat(ll a, ll mod) {
    return pow(a, mod - 2, mod);
}

模板

ll pow(ll x,ll y)
{
    x%=mod;
    ll res=1;
    while(y)
    {
        if(y&1)
            res=(res*x)%mod;
        x=(x*x)%mod;
        y>>=1;
    }
    return res;
}
// pow(a,mod-2);

拓展欧几里得

示例代码

using ll = long long;
 
// exgcd:ax + by = gcd(a, b) 的一组解
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, y, x); 
    y -= a / b * x;
    return d;
}

// 求 a 在模 mod 下的逆元 ( mod 可为任意整数,需 gcd(a, mod) = 1)
ll inv_exgcd(ll a, ll mod) {
    ll x, y;
    ll d = exgcd(a, mod, x, y);
    if (d != 1) return -1; // 不存在逆元
    return (x % mod + mod) % mod;
}

模板

ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll d=(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
ll inv_exgcd(ll a)
{
    ll x,y;
    ll d=exgcd(a,mod,x,y);
    if(d!=1)
        return -1;
    return (x%mod+mod)%mod;
}

对比

对比维度 费马小定理 扩展欧几里得 (exgcd)
模数要求 必须为质数 任意整数(只需互质)
互质要求 \(( \gcd(a,p)=1 )\) \(( \gcd(a,m)=1 )\)
核心运算 快速幂(乘法) 辗转相除(加减乘)
时间复杂度 \(( O(\log p) )\) \(( O(\log m) )\)
代码长度 短(仅快速幂) 稍长(递归回溯)
是否依赖质数检验 是(若误用于合数,结果错误)
常数因子 较大(快速幂循环约 30~60 次乘法) 较小(欧几里得迭代约 10~20 次)
批量求逆元 配合阶乘预处理 \(( O(n) )\) 也可线性递推,但需模数为质数
posted @ 2026-08-11 22:46  ForgeTheWorld  阅读(10)  评论(0)    收藏  举报