数论 · 求解线性同余方程
问题
求解方程 a x + b y = c ax+by=c ax+by=c。
以下摘自一本通
1 求特解
定理
对于该方程,它等价于 a x ≡ c ( m o d b ) ax \equiv c \pmod b ax≡c(modb)。
即有整数解的充要条件就是: gcd ( a , b ) ≡ 0 ( m o d c ) \gcd (a,b) \equiv 0 \pmod c gcd(a,b)≡0(modc)。
求解
根据定理,我们可以先用 扩展欧几里得算法 求出一组解 x 0 , y 0 x_0,y_0 x0,y0,即 a ∗ x 0 + b ∗ y 0 = gcd ( a , b ) a*x_0+b*y_0=\gcd (a,b) a∗x0+b∗y0=gcd(a,b)。
然后两边同除 gcd ( a , b ) \gcd(a,b) gcd(a,b),再同乘 c c c 即可得到特解。
( a ∗ x 0 + b ∗ y 0 ) ∗ c ÷ gcd ( a , b ) = c (a*x_0+b*y_0) * c\ \div\gcd (a,b)=c (a∗x0+b∗y0)∗c ÷gcd(a,b)=c
2 求通解
定理
若 a ⊥ b a \perp b a⊥b,且 x 0 , y 0 x_0,y_0 x0,y0 为方程 a x + b y = c ax+by=c ax+by=c 的一组解,
则该方程的任意解可以表示为: x = x 0 + b ∗ t , y = y 0 − a ∗ t x = x_0 +b *t,\ y = y_0 - a*t x=x0+b∗t, y=y0−a∗t,且对 t 为任一整数都成立。
求解
按照上述定理可以求出方程的所有解。
但实际往往让我们求最小整数解,也就是:
t = b ÷ gcd ( a , b ) , x = ( x m o d t + t ) m o d t t = b \div \gcd(a,b),\ x = (x \bmod t+ t) \bmod t t=b÷gcd(a,b), x=(xmodt+t)modt
【补】 求最小解
可以看 P1516 青蛙的约会 这道题,里面就有求最小解的部分。
详细证明看 小花的题解 有对通解、最小解公式的证明。
3 代码
用扩欧求解线性方程 a x + b y = c ax+by=c ax+by=c。
inline bool linearEquation (int a, int b, int c, int &x, int &y)
{
int gcd = exgcd (a, b);
if (c % gcd) return false;
int k = c / gcd;
x *= k, y *= k;
return true;
}
—— E n d End End——
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现