模运算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 $
逆元
费马小定理
示例代码
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) )\) | 也可线性递推,但需模数为质数 |

浙公网安备 33010602011771号