title: Ax+By=C问题
tags:
- 数论
categories:
- 数学知识
总结总结 Ax+By=C 问题
Ax+By=C的解的讨论(仅A,B为常数)
讨论一下该不定方程的解与C的取值存在什么关联:
- 若A,B互质,则对任意的C,满足等式的x,y一定有解且有无穷多个。
若还要求x,y的解非负,那么满足Ax+By=C的无解的C的个数是有限的,C最大取
max{C|C导致无解}=AB-(A+B)。**注:也就是说当C大于max值,一定有解。 - 若A,B不互质,则对任意C,不能保证x,y一定有解;
这时当且仅当 C%GCD(A,B)==0 ,不定方程有解;
***注:不能保证有解即满足Ax+By=C的无解的C的个数为INF
例题奉上:
- ·【蓝桥】·买不到的数目
- ·【蓝桥】·包子凑数
Ax+By=C的解(A,B,C均为常数)
不定方程的解分两种情况:
- C%GCD(A,B)==0 方程有解,特别的GCD(A,B)=1,方程有唯一解。
- 反之无解。
第①种情况下,该方程的解同时可转换为模线性方程(同余方程)的解:
求解模线性方程(同余方程)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扩欧
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;
}
}
输出一组特解
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/