41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
#include <bits/stdc++.h>
|
||
|
||
using namespace std;
|
||
typedef long long LL;
|
||
//扩展欧几里得
|
||
LL exgcd(LL a, LL b, LL &x, LL &y) {
|
||
if (!b) {
|
||
x = 1, y = 0;
|
||
return a;
|
||
}
|
||
LL d = exgcd(b, a % b, y, x);
|
||
y -= a / b * x;
|
||
return d;
|
||
}
|
||
int main() {
|
||
/* 原始方程 4x+6y=10 求x,y的一组解
|
||
|
||
分析及求解步骤:
|
||
此题中a=4,b=6,c=10
|
||
1. 求d=gcd(a,b)=gcd(4,6)=2
|
||
2. 判断 2|c即 10%2=0,方程有解,如果不能整除,此处可以直接返回方程无整数解
|
||
3. 化简方程为 a/d*x+b/d*x=c/d 得到 4/2*x+6/2*y=10/2
|
||
=> 2x+3y=5 此方程与原始方程解是一样的,我们最终对这个方程下手。
|
||
4. 如可解此方程呢?我们有一个好用的定理:扩展欧几里得可以解类似的方程
|
||
ax+by=gcd(a,b)!
|
||
但问题是按扩欧的描述,我们现在能计算的是 2x+3y=1的方程解!!!
|
||
不是原方程2x+3y=5的解!!
|
||
该怎么办呢?
|
||
设 x0,y0为2x+3y=1的解,那么原方程的一组解就是:
|
||
x1=5*x0,y1=5*y0!!!!
|
||
|
||
为什么呢?原因很简单: 2x+3y=1 左右都乘以5
|
||
2*(x*5)+3*(y*5)=5
|
||
对比一下原方程 x1=x0*5,y1=y0*5啊~
|
||
*/
|
||
LL x, y;
|
||
exgcd(2, 3, x, y);
|
||
printf("2x+3y=1 -> x=%lld y=%lld\n", x, y);
|
||
printf("2x+3y=5 -> x=%lld y=%lld", 5 * x, 5 * y);
|
||
return 0;
|
||
} |