Ax+By=C问题

总结总结 Ax+By=C

Ax+By=C的解的讨论(仅A,B为常数)

讨论一下该不定方程的解与C的取值存在什么关联:

  1. 若A,B互质,则对任意的C,满足等式的x,y一定有解且有无穷多个
    若还要求x,y的解非负,那么满足Ax+By=C的无解的C的个数是有限的,C最大取
    max{C|C导致无解}=AB-(A+B)。**注:也就是说当C大于max值,一定有解。
  2. 若A,B不互质,则对任意C,不能保证x,y一定有解;
    这时当且仅当 C%GCD(A,B)==0 ,不定方程有解;
    ***注:不能保证有解即满足Ax+By=C的无解的C的个数为INF

例题奉上:

  1. C%GCD(A,B)==0 方程有解,特别的GCD(A,B)=1,方程有唯一解。
  2. 反之无解。
    第①种情况下,该方程的解同时可转换为模线性方程(同余方程)的解:
    求解模线性方程(同余方程)ax=b(mod n)
  • 设d = gcd(a, n), 假定对整数x’, y’, 有d = ax’ + ny’,
    如果d | b, 则方程ax = b(mod n)有一个解的值为x0, 满足:
    x0 = x’(b / d)(mod n)
    于是求得x’的解就可得到x0的解即方程 ax-ny=b的解
    而ax’+ny’=d的解又需要用到Extend_Eculid定理
    有关Extend_Eculid的通解可参考我的:Extend_Eculid
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ll Extend_Eculid(ll a, ll b, ll &x, ll &y)
    { //求解ax + by = Gcd(a,b) 函数的返回值为GCD(a,b)
    if(!b)
    {
    x = 1; y = 0;
    return a;
    }
    else
    {
    ll temp = Extend_Eculid(b, a%b, y, x);
    y = y - a/b*x;
    return temp;
    }
    }

输出一组特解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
ll a, n, b, d, x, y;
cin>>a>>n>>b; //ax=b(mod n)
d= Extend_Eculid(a, n, &x, &y); //返回值d = Gcd(a, n),并得到一组特解x',y'
printf("Gcd(a,n) = %lld\n", d);
printf("x0=%lld, y0=%d\n", x, y);
if(b%d) //当d|b,方程才有解
printf("-1\n");
else
{
int x0 = x*(b/d)%n;
int y0 = (b-a*x0)/n;
printf("特解:%d %d\n", x0, y0);

}
}
当然可以得到一组x0了可以算一下其他通解
​```c++
int x1 = x0 + i*(n/d);

对于特别的 GCD(A,B)=1 有唯一解,其解即为a的逆
有关逆元可参考我的: https://www.weayer.top/2020/02/28/Inverse/


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!