线性同余方程
线性同余方程
定义:形如 \(ax \equiv b \ (mod \ p)\) 的方程,其中 \(a,b,n\) 我给定的整数,\(x\) 为未知数,从区间 \([0,n-1]\) 求解 \(x\),当解不唯一时求出所有解。
用逆元求解
如果 \(gcd(a,p)=1\),则 \(x \equiv ba^{-1} \ (mod \ p)\) 。
否则不一定有解,即当 \(gcd(a,p) \ | \ b\),有解,否则无解。
原式子为:\(ax \equiv b \ (mod \ p)\), 令 \(gcd(a,p)=d\),则两边同时除以 \(d\),得到 \(a'x \equiv b' \ (mod \ p')\),此时 \(a'\) 和 \(p'\) 已经互素了,那么 \(x'\) 就可以作为 \(x\) 的解,很明显 \(x'\) 也是原方程的解,但这个不是唯一的解,可以看出原始方程的解有 \(g\) 个:
形如:\(x_i \equiv (x'+i·p') \ (mod \ p) \quad for \ i = 0,1,...,g-1\) 。
总而言之,线性同余方程的解的数目等于 \(gcd(a,p)\) 或等于 \(0\) 。
用扩展欧几里得来求解
转化为扩展欧几里得为:\(a\frac{b}{gcd(a,p)}x_0+p\frac{b}{gcd(a,p)}k_0=b\) 。
如果 \(gcd(a,p)=1\),且 \(x_0、k_0\) 为方程 \(ax+pk=b\) 的一组解,则方程的任意解可以表示为:
\(\left\{\begin{array}{l} x=x_0+pt \\ k=k_0-at \end{array}\right.\)
- 模版:洛谷P1082。
template<typename T>
struct fc{
inline T exgcd(T a, T p = 1e9 + 7, T &x, T &y) {
if (!p) {
x = 1;
y = 0;
return a;
}
T d = exgcd(p, a % p, y, x);
y -= a / p * x;
return d;
}
inline bool get(T a, T b, T p = 1e9 + 7, T &x, T &y) {
T d = exgcd(a, p, x, y);
if (b % d) return false;
T k = b / d;
x = x * k % p;
y = y * k;
x = (x + p) % p;// 求出最小的整数解
return true;
}
};

浙公网安备 33010602011771号