标签:stream \n 如何 除法 cout 最小 rac 另一个 pre
所谓二元一次不定方程,指的是关于$x,y$的,形如$ax+by=c$的方程
在这里我们约定$a,b,c$均为整数。
那么我们遇到的问题是:如何判断这个方程有解呢?
裴蜀定理:设$a,b,d$均为整数,且$(a,b)=d$,则存在$u,v$使得$ua+vb=d$
证明:由$(a,b)=d$知$且d|a且d|b$,那么就有$d|ua+vb$
? 记$ua+vb$的最小正值为$s$,则$d|s$
? 对a做带余除法得:$,且与均为整数a=qs+r(0\leq r<s,且q与r均为整数)$
? 则$r=a-qs=a-q(ua+vb)=(1-qu)a+(-qv)b$,故r为a,b的线性组合(你可以将线性组合理解为一个整数z可以被表示成ax+by(都是整数))
? 而s为$ua+vb$的最小正值且$0\leq r<s$,所以$r=0$,即$a=qs$
? 所以$s|a$
? 同理可证$s|b$
? 故$即s|(a,b)即s|d$,又由$d|s$知$d=s$
在明确了裴蜀定理之后,我们便可以得出二元一次不定方程有解的条件:$gcd(a,b)|c$
证明:设$d=gcd(a,b),a=a_1d,b=b_1d,c=c_1d$,则原方程可化为$a_1x+b_1y=c_1,gcd(a_1,b_1)=1$
? 由裴蜀定理知,存在整数$x_0,y_0$,使得$a_1x_0+b_1y_0=1$
? 所以$a_1(x_0c_1)+b_1(y_0c_1)=c_1$
? 从而原方程有一组整数解$x=x_0c_1,y=y_0c_1$
我们在刚刚的证明中构造出了方程的一组解,很明显的发现如果按照上述方法求解明显是行不通的,所以我们必须得想一个方法求出不定方程的一组解
在上面的证明过程中,除了已知数,我们反复提到了另一个数$gcd(a,b)$
我们来看一下能否从这个数中发现一些端倪
先解这个方程$ax+by=gcd(a,b)$
(1)若$b=0$,则$gcd(a,b)=a$,原方程即$a·x+0·y=a$,显然$x=1,y=0$
(2)若$b\neq 0$,则$gcd(a,b)=gcd(b,a\ mod\ b)$
? 由此可以知道$ax+by=bx_0+(a\ mod\ b)y_0=bx_0+(a-a\ div\ b*b)y_0=ay_0+b(x_0-a\ div \ b*y_0)$
因此$x=y_0,y=x_0-a\ div\ b*y_0$
而我们已经知道了最后一次的$与x_0与y_0$的值
所以逐层往上倒推即可
由于所有过程是建立在求$gcd(a,b)$的基础上的,所以这个方法叫做扩展欧几里得
代码如下
1 #include<iostream> 2 #include<string> 3 #include<string.h> 4 #include<stdio.h> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 #include<map> 9 using namespace std; 10 11 void exgcd(int a,int b,int &x,int &y) 12 { 13 if (b==0) {x=1;y=0;return;} 14 exgcd(b,a%b,x,y); 15 int tmpx=x,tmpy=y; 16 x=tmpy;y=tmpx-(a/b)*tmpy; 17 } 18 19 int main() 20 { 21 int a,b; 22 cin >> a >> b; 23 int x,y; 24 exgcd(a,b,x,y); 25 cout << x << " " << y; 26 return 0; 27 }
若不定方程为$ax+by=k*gcd(a,b)$,则直接在所求得的$x,y$的基础上乘上$k$即可
我们在求出了原不定方程的一组解后,能否用它来推出所有解呢?
假设我们当前求出的解是$(x_0,y_0)$,下一组解是$(x_0+d_1,y_0+d_2)(其中d_1是满足条件的最小的正整数)$
则$a(x_0+d_1)+b(y_0+d_2)=c,ax_0+by_0=c$
带入解得$ad_1+bd_2=0$,即$\frac{d_1}{d_2}=-\frac{b}{a}$
化简得$\frac{d_1}{d_2}=-\frac{\frac{b}{gcd(a,b)}}{\frac{a}{gcd(a,b)}}$
因而二元一次不定方程$ax+by=c$的一般解可表示为
$$x=x_0+k*\frac{b}{gcd(a,b)},y=y_0-k*\frac{a}{gcd(a,b)}$$,其中$k\in Z$
标签:stream \n 如何 除法 cout 最小 rac 另一个 pre
原文地址:https://www.cnblogs.com/zhou2003/p/9782210.html