对于一些数论专题总是有些晕,还是要多做题(O_O)
所谓线性模方程,就是形如ax≡b(modn) (a,x,b,n∈Z∗)的方程。。
已知a,b,需要求解最小的x值。
方法如下:
原方程等价于ax−ny=b,令d=gcd(a,n)。
如果bmodd≠0,则方程无解,因为左边是d的倍数,而右边不是。
如果bmodd=0,则先使用扩展欧几里得算法求出方程ax′+ny′=d的一组解,然后原方程的解x=(x′×(b÷d))modn,这里略去证明。
代码如下:
long long exgcd(long long a, long long b, long long &x, long long &y){
if(!b) {
x = 1;
y = 0;
return a;
}
long long g = exgcd(b, a%b, y, x);
y -= (a/b)*x;
return g;
}
bool liner_mode_equition(long long a, long long &x, long long b, long long n) {
long long x_, y_, d = exgcd(a, n, x_, y_);
if(b % d != 0) return false;
x = (x_ * (b / d)) % n;
return true;
}
就是这么简单(^__^)!